2009-08-18 8 views
1

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

[_children release]; 

「私も(MEM警告が発生した可能性の後に)いくつかの点でオブジェクトを再帰する必要があるので、私はオブジェクトがまだ残っている場合、私はにISNどのnil-するための比較で行うれ、チェックする必要があります配列を解放しても何もないわけではないので動作しません。

繰り返し処理中に配列を変更することができないため、オブジェクトを1行ずつ削除してnilに設定することはできません。

私には明らかなものがありません。私は配列内のいくつかの値を+ nilにしたいだけです。

答えて

5

申し訳ありませんが、あなたがしていることは私にとっては無意味です。オブジェクトをnilに設定することはできません。オブジェクトへの参照はnilにしか設定できませんが、それは他の参照に影響します。私は「」配列に入れ、その後、配列から再び「an」は、1つだけ減少するの保持カウントを、それを削除した場合

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に設定することは、 "a"を指し示す他の変数に影響を与えません。

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

あなたは何をしようとしているのかは確かではありませんが、それは確かに可能ですが、あなたはここでは間違ったトラックにいます。

+0

説明をありがとう。私は間違ったトラックにいて、回避策を見つけました。私はC++のバックグラウンドにいるので、すぐには分かりませんでした。あなたの例では、私はb == nilと仮定していたでしょう – Sam

+1

あなたが実際に何をしているのかわからないので、私はよりよい解決法を提案できませんでした。配列内のオブジェクトが独自のクラスである場合、deallocメソッド(保持カウントがゼロになると呼び出されます)をオーバーライドすることができます。また、他のオブジェクト(デリゲートや通知をブロードキャストするなど)他のオブジェクトはあなたへの参照をゼロに更新できます。 – Mecki

+0

C++の場合でも、オブジェクトへのポインタがあれば、オブジェクト自体が破棄されたときに保持しているアドレスはクリアされません。Objective-Cと同じように無効なポインタがあります。あなたはまだメモリが割り当てられていた場所を指すリファレンスを持っています... –

0

配列要素を他の場所に保持していない場合は、必ず配列からオブジェクトを削除するか、配列自体を解放して要素を解放します。私はそれがあなたがする必要があるほど多いと思います。

各オブジェクトは、そのIDがアレイ 、それは が配列から除去され又は アレイの割り当てが解除されたときに解放メッセージに追加される前にメッセージ を保持受信:アップルのドキュメントから

+0

しかし、それがリリースされたことをどのように知っていますか?それが存在しないので私はそれを照会することはできません、そして、それはぶら下がっているポインタで私を残します... – Sam

+0

Apple APIはそう言っているので。配列からオブジェクトを削除したり、配列を解放したりすると、配列オブジェクトが解放されます。 – teabot

+0

あなたは誤解しています - (appleAPISaysThisObjectIsReleasedOrNot())を実行時には私はできません。私は回避策を見つけたので、とにかく感謝します。 – Sam

関連する問題