我在Xcode中打开了一个新的标志,并得到了警告:“在ARC模式下,弱接收器可能是不可预测的空值”。这让我感到困惑,因为当然它可能是nil。
我在Xcode中打开了一个新的标志,并得到了警告:“在ARC模式下,弱接收器可能是不可预测的空值”。这让我感到困惑,因为当然它可能是nil。
我一周前提出了这个问题,没有得到答案,但Greg Parker在邮件列表上回答了我的问题。因此,我要重新发布这个问题,并附上答案。
我们添加了这个警告,是因为我们在实践中看到了很多微妙且难以调试的问题。
推荐的做法是将弱变量读入一个强局部变量中一次,然后使用该局部变量。
- Greg Parker
在我第一次发布这个问题时,我发了类似下面的东西,当时我认为测试nil就足够了。
if (self.rootViewController) {
[self.rootViewController controllerWillChangeContent:controller];
}
问题在于,在检查为nil和完成调用方法之间,self.rootViewController可能会变成nil。我们被告知要做的是赋值给一个强大的本地引用并像这样使用它。- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
RootViewController *rootVC = self.rootViewController;
if (rootVC) {
[rootVC controllerWillChangeContent:controller];
}
}
Stephen Butler 简明扼要地重述了这个警告的目的是为了解决什么问题。
我们试图防止对象实例在你调用它(通过一个弱引用)并且没有任何强引用持有该对象的情况下,在 [someMethod] 中被释放。