2012-04-27 9 views
0

myLocationsArrayが不変であると宣言して、NSMutableArrayでremoveObjectAtIndexを呼び出すときに例外がスローされていました。その配列の他のすべての操作はうまくいた、それは間違いなく正しくなど宣言されたが、私のアプリのどこかには不変として設定されていた。それは不変のセットなった場所を見つけるためにしようとしているときのために調査した後、私はそれをネジを決めただけのような変数を再宣言:右removeObjectAtIndexコールの前にNSMutableArrayをNSMutableArrayとして再初期化します。

myLocationsArray = [[NSMutableArray alloc] initWithArray:[defaults 
objectForKey:MYLOCATIONSARRAY_KEY]]; 

しかし、私はこれが悪いことがあることを知っています、私はalloc/initを同じ変数で2回呼び出しています。しかし、それは働いている唯一のものです。私はこのような変数を思い出させる方法はありますか?NSMutableArrayは私のようにメモリリークを引き起こさないでしょうか?

+1

、それ以外の場合は誰でも適切なアドバイスをするのは難しいです。 –

答えて

1

NSUserDefaultsは、配列の不変なコピーを返します。 NSArrayNSMutableArrayのどちらを入力するかは関係ありません。常に不変のコピーバックを与えます。

だから、あなたが

myLocationsArray = [[NSMutableArray alloc] initWithArray:[[[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy] autorelease]]; 

かで動作することができます可変コピーを取得するには、この操作を行うだけで、この

myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy]; 
あなたは、配列を扱うと、これを引き起こす可能性がありますいくつかのコードを表示する必要が
+0

私は最終的に問題がNSUserDefaultsの不変のNSArraysを返すことであることを認識しましたが、NSMutableArraysを修正するためにNSMutableArraysを再宣言していましたが、私に変更可能なコピーを与えるように伝えることはできませんでした。 – jamzsabb

0

宣言は重要ではありません。あなたのエラーは実行時エラーです。 myLocationsArray変数に不変の配列(NSArray)が割り当てられているようですが、どこかに再割り当てされているのか、常に不変であったとしても、あなたのコードの断片から言うことはできません。

1

プログラムが例外をスローしている行(removeObjectAtIndexを含む行)にブレークポイントを設定し、デバッガで実際の型の配列を調べることをお勧めします。配列名の上にマウスを置くと、ポインティングされたオブジェクトについて必要なすべての情報を示すポップアップメニューが表示されます。

私が期待することは、オブジェクトがNSArray(対NSMutableArray)であることを発見し、最初に初期化したポイントまでトレースすることです。

1

NSUserDefaultsとお仕事しているようです。 NSUserDefaultsの外に出るすべてのオブジェクトは、そのオブジェクトに格納されているものに関係なく、常に不変です。 NSUserDefaultsは、あなたが設定した特定のオブジェクトへの参照を保持しません。のデータはのままです。効果的にコピーを作成しています。 NSUserDefaultsから何かを取得すると、保存されたデータから新しい(不変の)オブジェクトが作成され、それがあなたに与えられます。

驚くことではなく、NSUserDefaultsに保存されているものを変更することはできません。保存した内容は、以前に保存した内容を置き換えることによってのみ変更することができます。

+0

うん、それはNSUserDefaultsであることが分かった。私はそれにNSUserDefaultsからデータブロブを割り当てる前に自分のNSMutableArrayを宣言し、それを修正して自由に突然変異を可能にしました。ありがとう! – jamzsabb