18

我在 xcode 中打开了一个新标志并收到警告“弱接收器在 ARC 模式下可能无法预测为空”。这让我很困惑,因为当然它可能是零。

4

1 回答 1

27

一周前我问了这个问题,但没有得到答复,但 Greg Parker 在邮件列表中回答了这个问题。所以我正在转发答案。

我们添加此警告是因为我们在实践中看到了许多微妙且难以调试的问题。

推荐的做法是将弱变量读入一次强局部变量,然后再使用局部变量。

  • 格雷格·帕克

在这个问题的第一个化身中,我发布了类似这样的内容,我认为测试 nil 应该就足够了

if (self.rootViewController) {
    [self.rootViewController controllerWillChangeContent:controller];
}

问题是 self.rootViewController 在检查 nil 和完成调用的方法之间可能会变成 nill。我们被告知要做的是分配一个强大的本地引用并像这样使用它

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    RootViewController *rootVC = self.rootViewController;
    if (rootVC) {
        [rootVC controllerWillChangeContent:controller];
    }
}

斯蒂芬巴特勒对这个警告旨在解决的问题进行了简洁的重述

我们要防止的是对象实例在您处于 [someMethod] 时被释放,因为您将其从弱引用中调用,并且没有任何东西强烈地持有该对象。

于 2012-08-10T09:46:31.637 回答