0

最良の方法はどれですか

目的 c の "release" または "dealloc" メソッドをオーバーライドしますか?

なぜ?

4

4 に答える 4

3

どちらが最善の方法ですか?releaseまたはdeallocメソッドをオーバーライドしますか?

- dealloc、 絶対に。をオーバーライドしないでください- release

なんで?

1つは、release内部のものがたくさんあるからです。2つ目は、が呼び出された場合、オブジェクトの割り当てが解除されたことを意味するわけではないためです。release

したがって、誤ってivarを解放するか、プロパティをnullにすることになります。そして、代わりにワールドピースを持つことができるのに、誰が醜いセグメンテーション違反を望んでいますか?

オブジェクトが実際に割り当て解除されている場合は、- deallocが呼び出されます。

于 2012-11-26T10:41:23.263 に答える
3

非 ARC では、99% のケースで release メソッドをオーバーライドすべきではありません。

release メソッドをオーバーライドする必要があるケースは 1 つしかありません。これは一種のシングルトンであり、alloc を何回呼び出しても、クラスは実際には 1 つのインスタンスを持つことになります。

releaseそうすれば、メソッドだけでなくallowWithZone:、 、 、 'retainCount` などもオーバーライドできますretain(実際、その種のシングルトンを実装することは一般的ではありません)。

于 2012-11-26T10:54:35.310 に答える
0

ARC を使用していない場合は、-[MyObject dealloc]dealloc メソッドをオーバーライドして、オブジェクト内に保持されているすべてのオブジェクトを解放する必要があります。release メソッドをオーバーライドする必要があるケースを見つけたことはありません。

ARC を使用している場合、SQLite ポインターなどのように ARC が解放しないものを使用していない限り、通常は -dealloc メソッドのオーバーライドをまったく回避できます。

于 2012-11-26T10:38:17.997 に答える
0

メモリ管理に関係のないものをオーバーライドしないでください。それらのメソッドがいつ呼び出されても、それらのメソッドが呼び出されることはありません。

解放する必要がある場合の例外:

  • KVO / 通知センター オブザーバーの削除
  • 手動で割り当てられたメモリの割り当てを解除する (アーク) / ivar を解放する (非アーク)
于 2012-11-26T12:56:10.713 に答える