1 [myInstanceの解除]の代わりに[self.myInstanceリリース]
前者を好む。
戻り値self.myInstance
は、サブクラスがメソッドmyInstance
をオーバーライドしたときの実装によって定義されます。 dealloc中に構築されたオブジェクトのインターフェースの振る舞いには興味がありません(サブクラスがあなたのivar以外のものを上書きして返すかもしれないので)。
deallocに興味のあるものは、オブジェクトが破棄される前に所有している参照を解放しています。サブクラスはmyInstance
をオーバーライドしている場合、それは可能性:
a)のサブクラスで宣言さIVARを(返す)すでに新規を返すことが
または
b)のオーバーライドの実装をリリースしているなら、オートレリースされたオブジェクトを作成しました
aまたはbのいずれかが過剰リリースおよびクラッシュにつながる可能性があります(他のすべてが正しく保持または解放されていると仮定します)。これはなぜそれを解放した後にivarにnilを割り当てるべきなのかを示唆しています。
これは、オブジェクトの復活をトリガする方法の古典的な例です。オブジェクトの復活は、getter/setterの実装がすでに割り当て解除された後でその状態を再作成するときに発生します。最も攻撃的でない副作用は無害な漏れを引き起こすであろう。
2)myInstanceの= nilの代わりに再びself.myInstance =ゼロ
は、前者を好みます。
正式な応答は、#1の応答とよく似ています。正当な理由、副作用、危険性もここに当てはまります。
これを処理する最も安全な方法は、直接IVARにアクセスすることです:再現するのは難しいかもしれ本当に厄介な副作用(クラッシュ、リーク、復活)が存在する可能性があるので
[myInstance release], myInstance = nil;
を。
これらの危険性は簡単に回避でき、コードははるかに維持しやすくなります。一方で、プログラムを使用するときに副作用が発生した場合、可能な限りどこでも(再)使用を避けることになります。使用
myInstance = nil
代わり
self.myInstance = nil
では、myInstanceのが保持している場合(のUIViewControllerのサブクラスでviewDidUnloadメソッドを言うのコンテキストで)正しくないことを
幸運
サイトを検索してください。この質問は以前何度も出てきました。 –