2009-08-08 37 views
1

いくつかの状況では、いくつかの場所でオブジェクトを削除することに関連するリークがあります。配列と参照ポインタからの削除後の解放

前提: - 私はTreeオブジェクトのNSMutableArrayを持っています(Treeオブジェクトは自身を描画する方法を知っています)。 - 私は参照ポインタ(ツリー*が選択されています)は、基本的にどのツリーに最後に触れたかを指しています。 - *選択したポインタが弱い参照であることに注意してください。

これまでのところ良いです。

問題: ツリーを削除するとリークが発生します。リストから、削除されているツリーが配列から削除する前にすべてを内部的に解放していることを確認します(配列から削除すると、自動的にそのリリースが呼び出されます)。私は私のツリー*選択ポインタが自己プロパティを通じて触れツリー割り当てられていることに気づい :どのような私が試した

ツリー=

がself.selected。

...これを行うことで、それが保持されていることがわかります。だから私がしようとしたのは電話でした:

[self.selected release];

これは、ツリーがアレイから削除された直後に呼び出されました。 ...しかし、それは、それが本質的にすでにリリースされていると述べています。

質問: なぜこのエラーメッセージが表示されますか?私は配列からそれを削除しましたが、私のself.selectedポインタはまだ保持されている数を持っています。

おそらく、削除処理後にnilに設定する必要がありますか? または、削除プロセスの前に自動解放に設定する必要がありますか?

+0

私の質問を改訂してください: *選択されたポインタは配列内のオブジェクトの保持カウントを持っているので、そのオブジェクトを配列から削除すると割り当てが解除されるのはなぜですか?私はそれに保持された参照を持っていたという事実は、それが正しい、割り当て解除されるのを防ぐ必要がありましたか? –

+0

それでは、selfキーワードを使わずに*選択されたポインタを割り当てていました。削除プロセスを行った後、私はrefポインタの呼び出しを呼び出すことも、nilに設定しないでください。 これまでのところ漏れはありません! –

+0

Shit。リーク、リーク、リーク、それは戻ってきた。 –

答えて

0

おそらく起こっているのは、割り振り解除されたオブジェクトを指しているもので、何もありません。selectedです。

私は明示的にそれを解放するのではなく、

self.selected = nil; 

を試してみました。保持カウントも処理する必要があります。

1

selectedインスタンス変数の保持/解放をマイクロマニフェストしないでください。あなたはselectedが弱参照になりたい場合は、assign属性でそれを宣言します。あなたはそれに値を割り当てるときに、それが保持されません

@property(nonatomic, assign) Tree *selected; 

その方法。概念的には、あなたのNSMutableArrayが保持している参照を「ピギーバック」します。あなたはNSMutableArrayのから何かを削除するときに、ビットのようにそれを行う:

if (self.selected == toBeRemoved) 
    self.selected = nil; 
[myArray removeObject:toBeRemoved]; 

明示的assignを指定していないとあなたの財産は、その内容を保持している場合、あなたが最も可能性の高い例外を取得し、次の割り当て理由既に[self.selected release]メッセージで解放されていた別の-releaseメッセージが古い値に送信される原因となった要素を削除した後にself.selectedに送信しました。

0

基本的に、私は弱い参照を 'self'を使って割り当てていたので、内部的にretainを呼び出していました。私は「自己」を取り除きました。今は物事が上品で素敵です。 :) ありがとう!

関連する問題