每个刚接触OC的童鞋们,对block的使用都很头痛。
block是一个闭包,类似于函数,但是我们调用的时候传递的是一个代码块,它可以存在参数,这个参数并不是在定义block的时候就赋予值, 而是我们在实际运行block的时候才赋予值.(这一点需要注意,只有我们调用block时,才会运行代码块)
废话少说,下面我就讲下block作为形参和属性的时区别(直接上代码)
================================================
先建两个类,A类、B类;A跳转B类,通过block将B类的参数值回传A类
-- A类 -- -- B类 --
先在B类.h中声明一个代码块
typedef void(^changeLabel)(NSString * str)
1、block作为属性
(1)建立B类
在B.h中声明:
@property(nonatomic,copy)changeLabel blockOne;//作为属性
在B.m中:
- (void)viewWillDisappear:(BOOL)animated{
// block调用(相当于函数的调用)
if (self.blockOne) {
self.blockOne(self.textField.text);//将B类中的文本框的内容传递给A类
}
}
(2)建立A类
在A.m中:
- (IBAction)next:(id)sender {
BClassVC *b =[[BClassVC alloc]init];
// block的定义类比于函数的定义(这个block只有在B类中被调用时才会执行,通过回调,将B类中的文本框的内容传递给A类)
b.blockOne= ^(NSString * str){
_label.text = str;
NSLog(@"======%@===blockOne=====",str);
};
[self.navigationController pushViewController:vc animated:YES];
}
2、block作为参数
(1)建立B类
在B.h中:
- (void)para:(changeLabel)blockTwo;//作为形参
在B.m中:
- (void)para:(changeLabel)blockTwo{
blockTwo(@"====para:(changeLabel)blockTwo===");
}
(2)建立A类
在A.m中
- (IBA)Click:(id)sender{
BClassVC *b =[[BClassVC alloc]init];
/*调用para:(changeLabel)blockTwo
通过形参Block回调打印“====para:(changeLabel)blockTwo===”*/
[b para:^(NSString *str) {
NSLog(@"%@",str);
}];
}
欢迎常来,不足之处,各位小伙伴多提意见,一起交流,一起进步。