18

xcodeで新しいフラグをオンにすると、「ARCモードでは弱いレシーバーが予期せずnullになる可能性があります」という警告が表示されます。もちろん、それはゼロである可能性があるため、これは私を混乱させます。

4

1 に答える 1

27

1週間前にこの質問をしましたが、回答がありませんでしたが、GregParkerがメーリングリストで回答しました。だから私は答えを付けて再投稿しています。

実際には多くの微妙でデバッグが難しい問題が発生したため、この警告を追加しました。

推奨される方法は、弱い変数を一度強いローカル変数に読み込んでから、ローカル変数を使用することです。

  • グレッグパーカー

この質問の最初の化身で、私はこのようなものを投稿しました。ここでは、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 に答える