Block研究

来源:互联网 发布:淘宝上的海藻胶面膜贴 编辑:程序博客网 时间:2024/06/06 01:41

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);};
0 0