2012-04-18 8 views
0

によってNSMutableDictionaryのコピーを作成する必要があります。コピーしたNSMutableDictionary変更できません

NSMutableDictionary *newScoutingEventDictionary = [[[NSMutableDictionary alloc] initWithDictionary:self.scoutingEvent copyItems:YES] mutableCopy]; 

が、私はそれに配列を変異しようとすると:

[[newScoutingEventDictionary objectForKey:@"myArray"] replaceObjectAtIndex:i withObject:appendedEntry]; 

を、それは私にエラーを与えます

-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x964d650 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x964d650' 

元のNSMutableDictionaryを変更しようとすると:

[[self.scoutingEvent objectForKey:@"myArray"] replaceObjectAtIndex:i withObject:appendedEntry]; 

うまく動作します。なぜ私のコピーされたバージョンはそれを壊しているのです

+3

私は、NSMutableDictionary * newScoutingEventDictionary = [[[NSMutableDictionary alloc] initWithDictionary:self.scoutingEvent copyItems:YES] mutableCopy];が実際に2つのコピーを作成し、そのうちの最初のものがリークしていることを指摘しておきます... –

+0

er ... 。 どうして?私はそれを見ない/理解しない。 – Padin215

+1

正確には、[基本メモリ管理規則](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//)から2つの新しいインスタンスを作成します。 apple_ref/doc/uid/20000994-BAJHFBGH)、「alloc」は1つのインスタンスが作成されることを意味し、「mutableCopy」は第2のインスタンスを意味します。 –

答えて

5

mutableCopy浅い可変コピー。辞書内の不変オブジェクトを変更可能にすることはありません。

さまざまな理由でAPIの一部ではないため、実装する必要があります。深い可変コピーが必要な場合は、それを実装する必要があります。

また、辞書をプロパティリストとして表すことができる場合は、1つに変えてさまざまなオプションパラメータを使用して、アーカイブが解除されたときに変更可能なコレクションや葉を作成できます。

+0

私はその周りで遊んだ、私はmutableCopyを削除し、no(基本的にちょうどinitWithDiciontary:メソッドを使用)にcopyItemを設定します。私は今元の辞書のコピーを持っています。私はコピーを変更することができます(replaceObjectAtIndex :)と元の変更されません。 :? – Padin215

関連する問題