block的循环引用 你知道多少

众所周知,在block中的对象引用 要用__weak,比如

Person *p = [Person new];
p.block = ^{
 NSLog(@"%@", p.name);
};
p.block();

上述做法会循环应用 造成内存泄露,需要写成

Person *p = [Person new];
__weak Person *weakP =  *p;
p.block = ^{
 NSLog(@"%@",  weakP.name);
};
p.block();

这样就不会内存泄露了

但是这样就完了吗?
NO NO 没有

Person *p = [Person new];
__weak Person *weakP =  *p;
p.block = ^{
  Person *strong = weakP;
   dispatch_after(when_dispatch_get_main_queue),^{
       NSLog(@"%@", strong.name);  
    }
};
p.block();

先改为weakP, 在第一个Block中该为strong, 然后第二个Block中用强引用,可以保证在回调第二个Block的时候,Person还活着
所以 在第一个block中将弱引用改为强应用 这样改之后 可以多个嵌套block.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容