2009-05-19 6 views
0

[[MyObject itemProperty] release]は受け入れ可能ですか?オブジェクトを別のオブジェクトに属している - xcodeメモリ管理

現在、私はいくつかのデータをフェッチして、それをitemPropertyに設定しています。次に、MyObjectの代理人が起動し、MyObjectのitemPropertyデータを使用して解放します。これはメモリ管理の許容可能な方法ですか?

私はさまざまな書籍から、あなたが宣言するオブジェクトだけをリリースすべきだと言われました。 ヒントや別の方法がありますか?

答えて

2

私はあなたが説明しているアプローチに反対することをお勧めします...それについての質問をするあなたの本能は、おそらく問題につながるので正しいです。

オブジェクトは独自の内部状態を管理する責任があり、そのような内部状態に代理人が干渉することは非常に珍しいことです。あなたがdeallocを実装している場合

- (void)dealloc { 
    [item release]; 
    [super dealloc]; 
} 

実際には、あなたが必要としてデリゲートは解放メッセージを送信した、MyObjectを整理するために:メモリをクリーンアップするための通常の練習は、そのdealloc方法でMyObjectリリースメモリを持っている必要がありますすることですitemPropertyのオブジェクトには、itemPropertyオブジェクトが2回リリースされることを意味します。これは、itemPropertyの保持カウントを予期しない状態にし、早期に割り当てを解除する可能性があります。他のオブジェクトがitemPropertyを使用しているようにアプリケーションを変更した場合、デリゲートが呼び出された後で不思議に割り当てが解除されています。

一方、にメモリを整理しないと、デリゲートが呼び出されてメモリが適切に管理されていることに頼っている状況が発生します。デリゲートメソッドがいつもあなたのアプリのどこかで呼ばれることを本当に保証できますか?必ず?アプリケーションに異常な実行フローが発生する可能性のある例外やその他のエラー条件があったとしても?

これを保証することができても、アプリケーションロジックが変更されても、これは当然のことかもしれません。また、デリゲートがメモリ管理を行っていることを忘れてしまい、リークやセグメンテーションが起こります。確かに、あなたのコードを管理している他のココア開発者は、メモリ管理の代理人を見ているとは思わないでしょうし、おそらく発生する問題をデバッグするのは難しいでしょう。

この場合、デリゲートは、アイテムを保持、解放、または自動解放しないでitemPropertyを使用してください(ただし、代理人がMyProが終了したあともitemPropertyが残っていることを保証する必要がない限り)。 MyObjectが割り当て解除されると、itemPropertyデータが解放されます。

0

一般的には、何かを割り当て、新規またはコピーするときにのみリリースされます。リリース以外に他のコードを提供していないので、リリースすべきかどうかは言い難いです。

あなたが言ったことから、最良の解決策は自動解放プールを使用しているようです。データを取得したら、MyObjectを呼び出して[itemProperty autorelease]を呼び出します。デリゲートがそれを使用した後、自動的に解放されます。しかし、それはあなたがどのようにそれを行うかによって異なります:-)

また、より多くのコードが役立ちます。

0

まず、オブジェクトを宣言しません。あなたのオブジェクトは他のオブジェクトを作成し、それらを所有し、それらを渡します。

あなたが所有していないものは絶対にリリースしないでください。オブジェクトを解放することは、「このオブジェクトを所有しないことを望みます」を意味します。あなたがすでにそれを所有していないなら、あなたは何を放棄していますか?このような悪いモジョーをすると破損することがあります。

現在の所有者の所有を停止する場合は、それを指示します。一般に、これは[myObject setItemProperty:nil](またはmyObject.itemProperty = nil)のようなものになります。または、新しいオブジェクトを提供することもできます。いずれにせよ、それを所有することをやめることは現在の所有者の責任です。

関連する問題