私はあなたが説明しているアプローチに反対することをお勧めします...それについての質問をするあなたの本能は、おそらく問題につながるので正しいです。
オブジェクトは独自の内部状態を管理する責任があり、そのような内部状態に代理人が干渉することは非常に珍しいことです。あなたがdealloc
を実装している場合
- (void)dealloc {
[item release];
[super dealloc];
}
実際には、あなたが必要としてデリゲートは解放メッセージを送信した、MyObject
を整理するために:メモリをクリーンアップするための通常の練習は、そのdealloc
方法でMyObject
リリースメモリを持っている必要がありますすることですitemProperty
のオブジェクトには、itemProperty
オブジェクトが2回リリースされることを意味します。これは、itemPropertyの保持カウントを予期しない状態にし、早期に割り当てを解除する可能性があります。他のオブジェクトがitemPropertyを使用しているようにアプリケーションを変更した場合、デリゲートが呼び出された後で不思議に割り当てが解除されています。
一方、にメモリを整理しないと、デリゲートが呼び出されてメモリが適切に管理されていることに頼っている状況が発生します。デリゲートメソッドがいつもあなたのアプリのどこかで呼ばれることを本当に保証できますか?必ず?アプリケーションに異常な実行フローが発生する可能性のある例外やその他のエラー条件があったとしても?
これを保証することができても、アプリケーションロジックが変更されても、これは当然のことかもしれません。また、デリゲートがメモリ管理を行っていることを忘れてしまい、リークやセグメンテーションが起こります。確かに、あなたのコードを管理している他のココア開発者は、メモリ管理の代理人を見ているとは思わないでしょうし、おそらく発生する問題をデバッグするのは難しいでしょう。
この場合、デリゲートは、アイテムを保持、解放、または自動解放しないでitemProperty
を使用してください(ただし、代理人がMyProが終了したあともitemPropertyが残っていることを保証する必要がない限り)。 MyObjectが割り当て解除されると、itemPropertyデータが解放されます。