美文网首页
block的循环引用 你知道多少

block的循环引用 你知道多少

作者: 奔哥小木屋 | 来源:发表于2017-03-30 17:25 被阅读30次

众所周知,在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.

相关文章

网友评论

      本文标题:block的循环引用 你知道多少

      本文链接:https://www.haomeiwen.com/subject/yhsedttx.html