最良の方法はどれですか
目的 c の "release" または "dealloc" メソッドをオーバーライドしますか?
なぜ?
どちらが最善の方法ですか?
release
またはdealloc
メソッドをオーバーライドしますか?
- dealloc
、 絶対に。をオーバーライドしないでください- release
。
なんで?
1つは、release
内部のものがたくさんあるからです。2つ目は、が呼び出された場合、オブジェクトの割り当てが解除されたことを意味するわけではないためです。release
したがって、誤ってivarを解放するか、プロパティをnullにすることになります。そして、代わりにワールドピースを持つことができるのに、誰が醜いセグメンテーション違反を望んでいますか?
オブジェクトが実際に割り当て解除されている場合は、- dealloc
が呼び出されます。
非 ARC では、99% のケースで release メソッドをオーバーライドすべきではありません。
release メソッドをオーバーライドする必要があるケースは 1 つしかありません。これは一種のシングルトンであり、alloc を何回呼び出しても、クラスは実際には 1 つのインスタンスを持つことになります。
release
そうすれば、メソッドだけでなくallowWithZone:
、 、 、 'retainCount` などもオーバーライドできますretain
(実際、その種のシングルトンを実装することは一般的ではありません)。
ARC を使用していない場合は、-[MyObject dealloc]
dealloc メソッドをオーバーライドして、オブジェクト内に保持されているすべてのオブジェクトを解放する必要があります。release メソッドをオーバーライドする必要があるケースを見つけたことはありません。
ARC を使用している場合、SQLite ポインターなどのように ARC が解放しないものを使用していない限り、通常は -dealloc メソッドのオーバーライドをまったく回避できます。
メモリ管理に関係のないものをオーバーライドしないでください。それらのメソッドがいつ呼び出されても、それらのメソッドが呼び出されることはありません。
解放する必要がある場合の例外: