時々、私はこのタイプのコードをobjective-cで見たことがあります。解放後に_imageViewをnilに設定するのはなぜですか?なぜオブジェクトを解放した後に 'nil'を使うのですか
- (void)dealloc {
[_imageView release];
_imageView = nil;
[super dealloc];
}
時々、私はこのタイプのコードをobjective-cで見たことがあります。解放後に_imageViewをnilに設定するのはなぜですか?なぜオブジェクトを解放した後に 'nil'を使うのですか
- (void)dealloc {
[_imageView release];
_imageView = nil;
[super dealloc];
}
リリースしたばかりのオブジェクトを再利用しようとしないようにするためです。
nil
に設定することで、問題を引き起こすのではなく、将来のメッセージが確実に捨てられるようになります(標準のnil
オブジェクトの動作)。
これは安全な方法であるからです。
deallocでは、スレッドを使用していない限り実際にはあまり意味がありませんが、そうでない場合は、オブジェクトにnilを割り当てるたびに(プロパティでない限り)常にそれを行うのが良い方法です。
私が理解しているように、deallocでは必要ありません。ただし、他の方法でオブジェクトを解放すると、ポインタは残っていますが、ポインタが指すオブジェクトはもはや存在せず、メッセージを送信するときにクラッシュが発生します。
ポインタをnilに設定すると、アプリケーションにクラッシュする(または奇妙な動作を引き起こす)代わりに、送信されたすべてのメッセージが無視されることが確実になります。
sidenoteでは、通常、 'dealloc'メソッドでivarをnilに設定する必要はありません。人がスーパークラスのイヴァールとハックリしない限り。 – JustSid