1

そのため、特定の状況下でのオブジェクトの削除に関連するリークがある場所もあります。

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

わかりました、これまでのところとても良いです。

問題: ツリーを削除するとリークが発生します。リストから、削除されるツリーが配列から削除する前にすべてを内部的に解放していることを確認します(配列から削除すると、自動的にリリースが呼び出されます)。

私が試したこと: Tree *selected ポインターが self プロパティを介してタッチされたツリーに割り当てられていることに気付きました:

self.selected = ツリー;

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

[自己選択リリース];

ツリーが配列から削除された直後にこれを呼び出しました。...しかし、その時点でクラッシュし、本質的には既にリリースされていることを示しています。

質問: このエラー メッセージが表示されるのはなぜですか? 配列から削除しましたが、self.selected ポインターにはまだカウントが保持されているため、解放するべきではありませんか?

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

4

3 に答える 3

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[self.selected release]

于 2009-08-08T03:22:25.530 に答える
0

基本的に、「self」を使用して弱参照を割り当てていたため、内部的にretainを呼び出していました。私は「自己」を取り除きました、そして今、物事は元気でダンディです。:) ありがとう!

于 2009-08-11T01:16:25.940 に答える
0

[おそらく] 起こっているのはselected、割り当て解除されたオブジェクトへのポイントであり、何もないことではありません。

やってみます

self.selected = nil;

明示的に解放する代わりに。これにより、保持カウントも処理されるはずです。

于 2009-08-08T01:05:20.143 に答える