假设你有这样的东西:
ivarOutsideOfBlock = @"foo";
[doSomethingThatTakesAwhile start:^(NSError *error) {
if(!error){
ivarOutsideOfBlock = @"somethingElse";
// Might crash because iVarOutsideOfBlock may no longer exist
}
}];
在这一点上,假设对视图控制器 ivar 的引用被解除了。代码会崩溃吗(地址无效)?
围绕此问题的最佳实践是什么?是将 ivar 转换为视图控制器上的强属性吗?
块中对 ivar 的引用是隐式viewController->ivar
的,并且块对 ivar 的所有者进行了强烈的引用。在区块之前,它不会被释放。
看起来您实际上有一个保留周期,因为块的所有者与引用的对象相同。这是有问题的:块和另一个对象保持彼此的活动,并且两者都不能解除分配。