"に割り当てられたオブジェクトの潜在的なリークnに格納され、 '変数'に格納されている可能性があります。このXcode Clangスタティックアナライザの警告をどのように抑制できますか?
通常、これは非常に有用なアナライザーの警告ですが、アナライザーの結果をきれいに保つために抑制したいと思っている偽陽性の厄介なものがいくつかあります。アナライザの防御では、別の実行パス(それが目に見えない)でのリリースではないことに気づいたことは間違いなくメモリリークになります。
私の状況を詳しく説明します。さまざまな味がありますが、一般的なパターンは次のとおりです。
- オブジェクトが割り当てられ、その代理人が設定されています。
- 何かがオブジェクトで行われます。 (開始されたタスク、表示されたビューなど)。
- 現在のメソッドの実行が終了します。 (Clang警告を入力してください)。
- オブジェクトはタスクが完了したことを判断し、代理人にメッセージを送信します。
- 委任者オブジェクトを解放します。
これはまったく難解なデザインパターンではないので、私は抑制が可能であると考えています。私はそれが後でリリースされるivarに違反オブジェクトを格納することによって避けることができることを知っていますが、私はivar汚染を追加しないことを大いに好んでいます。
オブジェクトの代理人がそれを保持していると奇妙に感じます。通常、オブジェクトはそのオブジェクトを代理オブジェクトとして保持し、オブジェクトを保持する代理オブジェクトに保持サイクルを持たせるようにします。私は、デリゲートがオブジェクトを(おそらく短命に)保持したいかもしれないゼロのケースがあると言っているわけではありませんが、なぜそれがここに当てはまるのかを知ることは重要です。ここで言われていることから、デリゲートがalloc/initの暗黙の保持を「所有権を取る」よりも、操作の間、オブジェクトとそれ以降のデリゲートメッセージを保持することがより正当なものだと言います。 – ipmcc
@ipmcc:オブジェクトがそのデリゲートを保持することは可能ですが、クラスにはちょっとしたところがありますが、デリゲートを弱い参照として保存するのが一般的ですあなたが言及するサイクルを保持する。いずれにしても、デリゲートを保持するのはオブジェクトにとって「典型的な」ものではありません。私の場合、いくつかのクラスはalloc/initでオブジェクトを作成し、デリゲートとして自身を設定しました。クラスの所有者として、デリゲートは後でオブジェクトが終了したときにそのオブジェクトを解放します。ここには何ら工夫はありません。 –
@ipmcc - マットが正しいです、通常のパターンは:オブジェクトAはオブジェクトBを作成し、それをオブジェクトBのデリゲートとして設定します。オブジェクトAはオブジェクトBを保持します。オブジェクトAが解放されると、オブジェクトBのデリゲートとして自身を設定解除します。そうでなければクラッシュする可能性があります。 – DougW