当块内的 ivar 可能被释放时,管理内存的最佳方法是什么?



假设你有这样的东西:

 ivarOutsideOfBlock = @"foo"; 
 [doSomethingThatTakesAwhile start:^(NSError *error) {
        if(!error){
            ivarOutsideOfBlock = @"somethingElse";
            // Might crash because iVarOutsideOfBlock may no longer exist
        }
  }];

在这一点上,假设对视图控制器 ivar 的引用被解除了。代码会崩溃吗(地址无效)?

围绕此问题的最佳实践是什么?是将 ivar 转换为视图控制器上的强属性吗?

块中对 ivar 的引用是隐式viewController->ivar的,并且块对 ivar 的所有者进行了强烈的引用。在区块之前,它不会被释放。

看起来您实际上有一个保留周期,因为块的所有者与引用的对象相同。这是有问题的:块和另一个对象保持彼此的活动,并且两者都不能解除分配。

最新更新