経験のある人がこれをもう少し説明できるかどうか疑問に思います。私は例を見てきました...
[view release];
view = nil;
....(void)dealloc内。
違いは何ですか?一方は他方よりも優れていますか?最善の方法は何ですか?
個人的にretainCountテストを実行すると、nilが3から0にカウントを落とすのを見ましたが、releaseは3から2にしかカウントを落とさないのです。
経験のある人がこれをもう少し説明できるかどうか疑問に思います。私は例を見てきました...
[view release];
view = nil;
....(void)dealloc内。
違いは何ですか?一方は他方よりも優れていますか?最善の方法は何ですか?
個人的にretainCountテストを実行すると、nilが3から0にカウントを落とすのを見ましたが、releaseは3から2にしかカウントを落とさないのです。
あなたが見たのはおそらくこれらです:
1) [foo release];
2) self.bar = nil;
3) baz = nil;
オブジェクトを解放し、インスタンス変数を介してアクセスしますfoo
。インスタンス変数はダングリングポインタになります。これは、deallocで推奨される方法です。
nil
自分自身のプロパティに割り当てていますbar
。これにより、実際には、プロパティが現在保持しているものはすべて解放されます。プロパティのカスタムセッターがある場合は、これを実行します。これは、プロパティをサポートするインスタンス変数以外のものをクリーンアップすることになっています。
オブジェクトを参照するポインタをnilで上書きしますbaz
が、オブジェクトを解放しません。その結果、メモリリークが発生します。これは絶対にしないでください。
プロパティを使用していない場合(self.property = nilもオブジェクトを解放します)、概説したように、常に参照をnilに設定するコードによる解放に従う必要があります。
[view release]; view = nil;
その理由は、無効な参照が使用される可能性を回避するためです。発生することはまれで困難ですが、発生する可能性があります。
IBOutletsを解放する場合、これはviewDidUnloadでさらに重要になります。これは、ビューのアンロードのメモリ警告が原因で参照が破損する可能性があり、ビュー内の他のコードが参照の前に参照を利用しようとする、より現実的なシナリオです。ビューがリロードされます。
基本的にはこれは良い習慣であり、これを行う習慣をつければ、ある時点でクラッシュを防ぐことができます。
@ bbullis22参照をnilに設定したため、保持カウントが3から0に低下しました。次に、ゼロである「nil」の保持カウントを要求しました。ただし、参照されていたオブジェクトの保持カウントは同じ-1です(参照をnilに設定したため)。リリースを使用しても、参照は同じオブジェクトを参照しているため、この状況で保持カウントが3から2に低下するのがわかります。
コード内での使用法に関してdealloc
は、プロパティへの割り当ては必要ありませんreleas
。必要なのはingだけです。
- (void)dealloc {
[myProperty release]; // don't need to assign since you won't have the object soon anyway
[super dealloc];
}
両方を使うのは一種のセーフティネットだと思います。release
参照カウント管理を台無しにすると、問題が発生する可能性があります。オブジェクトを解放して、そのメモリをシステムに戻しますが、ポインタは引き続き有効です。
にnil
メッセージを送信しnil
ても何も起こらないため、プログラムがクラッシュしないことが保証されます。