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

在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];
posted @ 2019-11-01 10:21  鄙人浪淘沙  阅读(170)  评论(0编辑  收藏  举报