Block的定义
block声明的方式:返回值(^block变量名)(参数)
block传值
与代理传值一样,用block传值,其实就是用block代替代理的逻辑去传值。
举例:从ViewController跳转到SecondViewController,然后需要从SecondViewController向ViewController传值,逻辑代码如下:
首先在SecondViewController声明一个block
@property (nonatomic, strong) void(^block)(NSString *value);
然后实现block的传值逻辑
if (_block) {
_block(@"123");
}再回到ViewController实现block的调用,这就是用block传值的简单逻辑
SecondViewController *second = [[SecondViewController alloc] init];
second.block = ^(NSString *value) {
NSLog(@"%@",value);
};
[self presentViewController:second animated:YES completion:nil]
block的循环引用
block造成循环引用的原因:block会对里面所有的变量都强引用一次。看下面代码:
_block = ^{
NSLog(@"%@",self);
};
当在ViewController中定义一个block,并且在block中实现这句代码的时候,这个控制器在返回的时候不会被销毁,原因是控制器持有了block,而block又持有了控制器,故造成了循环引用。解决办法是将self弱引用化。
__weak typeof(self) weakSelf = self;
_block = ^{
NSLog(@"%@",weakSelf);
};