1

NSMutableArray に格納されている一連のオブジェクトを解放しているときに、メモリ警告が表示されます。

[_children release];

また、ある時点でオブジェクトを再帰する必要があるため (おそらく mem 警告が発生した後)、オブジェクトがまだ存在するかどうかを確認する必要があります。これは nil- と比較して行います。 array は何も nil しません。

反復中に配列を変更することは許可されていないため、オブジェクトを 1 行 1 つずつ削除して nil に設定する配列をループできません。

明らかな何かが欠けているように感じます。配列内のいくつかの値を解放したいだけです。

4

2 に答える 2

5

申し訳ありませんが、あなたがしていることは私には無意味に思えます。オブジェクトを nil に設定することはできません。オブジェクトへの参照を nil に設定することしかできませんが、それは他の参照に影響を与えます。

NSObject * a = [[NSObject alloc] init];
NSObject * b = a;

[a release];
a = nil;

// b is NOT nil! b still points to the memory location where
// a used to be, which is now not valid anymore and using b
// for anything may crash your application!

「a」を配列に入れ、それを再び配列から削除すると、「a」の保持カウントが 1 減ります。その場合、まだゼロよりも大きい場合は "a" は解放されないか、ゼロの場合は解放されます。解放後に a への参照を nil に設定しても、まだ "a" を指している他の変数には影響しません。

したがって、NSArray が "a" への参照を配列から削除して解放した後 (その参照カウントがゼロになったため)、その参照を nil に設定していたとしても、まだ "a" を指しているインスタンス変数には影響しません。

あなたが何をしようとしているのかよくわかりませんし、確かに可能ですが、あなたはここで完全に間違った道を進んでいます。

于 2009-08-18T11:26:35.787 に答える
0

配列要素を他の場所に保持していないと仮定すると、配列からオブジェクトを削除するか、配列自体を解放することで、要素も解放されます。やるべきことはそれだけだと思います。

アップルのドキュメントから:

各オブジェクトは、その ID が配列に追加される前に保持メッセージを受け取り、配列から削除されるか、配列の割り当てが解除されると解放メッセージを受け取ります。

于 2009-08-18T11:18:03.683 に答える