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

时间:2015-03-17 18:48:05

标签: ios objective-c memory-management objective-c-blocks

让我们说你有这样的事情:

 ivarOutsideOfBlock = @"foo"; 

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

此时,让我们说对视图控制器ivar的引用得到了解决。代码会崩溃(INVALID ADDRESS)?

围绕此最佳做法是什么?它是否将ivar转换为视图控制器上的强属性?

1 个答案:

答案 0 :(得分:2)

Block中对ivar的引用隐含viewController->ivar,而Block强烈引用了ivar的所有者。它不会在阻止之前解除分配。

看起来你实际上有retain cycle,因为Block的所有者与引用的对象相同。这是有问题的:Block和另一个对象保持活着,并且都不能被释放。