0

NSMutableArray で removeObjectAtIndex を呼び出すと、アプリで例外がスローされ、myLocationsArray が不変であると宣言されるという問題がありました。その配列に対する他のすべての操作は問題なく、間違いなく正しく宣言されていましたが、アプリのどこかで不変として設定されていました。不変に設定されている場所を見つけようとしてしばらく調査した後、私はそれを台無しにして、変数を次のように再宣言することにしました:

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

removeObjectAtIndex 呼び出しの直前。

ただし、これは間違っているに違いないことはわかっています。同じ変数で alloc/init を 2 回呼び出しています。ただし、機能したのはそれだけです。私のようにメモリリークを引き起こすことなく、この変数が NSMutableArray であることを思い出させる方法はありますか?

4

4 に答える 4

1

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

私が期待しているのは、オブジェクトが NSArray (vs. NSMutableArray) であることをこの方法で見つけてから、最初にそれを初期化したポイントまでさかのぼることです。

于 2012-04-27T16:10:11.910 に答える
1

NSUserDefaults配列の不変のコピーを返します。NSArray入れても入れても問題ありませんNSMutableArray。常に不変のコピーが返されます。

したがって、これを実行して、操作できる可変コピーを取得します

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

またはこれだけ

myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy];
于 2012-04-27T23:35:15.413 に答える
1

と連携しているようですNSUserDefaults。取得したすべてのオブジェクトはNSUserDefaults、何を格納したかに関係なく、常に不変です。NSUserDefaults設定した特定のオブジェクトへの参照を保持せず、dataを保持します。効果的にコピーを作成しています。から何かを取得するとNSUserDefaults、格納されているデータから新しい (不変の) オブジェクトが作成され、それが提供されます。

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

于 2012-04-27T23:29:21.043 に答える
0

宣言は重要ではありません。エラーは実行時エラーです。変数が不変の配列(NSArray)に割り当てられているようにmyLocationsArray見えますが、どこかに再割り当てされているのか、常に不変であるのかは、コードフラグメントからはわかりません。

于 2012-04-27T16:08:23.423 に答える