美文网首页
ARC下block循环引用的解决方式

ARC下block循环引用的解决方式

作者: 浪淘沙008 | 来源:发表于2019-11-01 10:19 被阅读0次

在MRC情况下对block外的对象加上__block有两个作用:

  • 说明变量可修改
  • 说明指针指向的对象不做隐式的retain操作
    在ARC情况下即便对对象加上了__block,因为__block只声明该对象可以修改,一个对block捕获的也是对象也是一个强引用,所以这时就要对对象手动释放,否则依旧会造成循环引用:
    SeondViewController *__block ctl = [[SeondViewController alloc] init];
    ctl.testBlock = ^{
        [ctl sayHai];
        ctl = nil;
    };    
    [self.navigationController pushViewController:ctl animated:YES];

该方式的弊端是如果该block不调用,则依旧不会解除循环引用,这时__weak是个更优的选择:

    SeondViewController * ctl = [[SeondViewController alloc] init];
    SeondViewController * __weak weakCtl = ctl;
    ctl.testBlock = ^{
        [weakCtl sayHai];
    };
    [self.navigationController pushViewController:ctl animated:YES];

相关文章

网友评论

      本文标题:ARC下block循环引用的解决方式

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