2012-04-18 42 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];'实际上制作了两个副本,其中第一个被泄露... – 2012-04-18 20:58:16

+0

er ... 。 怎么会这样?我没有看到/理解它。 – Padin215 2012-04-19 15:44:12

+1

准确地说,它会根据[基本内存管理规则](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//)创建两个新实例apple_ref/doc/uid/20000994-BAJHFBGH),“alloc”表示一个实例被创建,而“mutableCopy”表示另一个实例。 – 2012-04-21 22:32:57

回答

5

mutableCopy做一个可变的副本。它不会使字典中的不可变对象变为可变的。

您需要执行 - 是的,实施,因为它不是API,适用于各种原因的一部分 - 深可变的复制,如果这是你所需要的。

另外,如果你的字典可以表示为一个属性列表,你可以变成一个,然后使用不同的参数选项,使可变集合和/或离开时,它是未归档。

+0

我玩过它,我删除了mutableCopy并将copyItem设置为no(基本上只使用initWithDiciontary:方法)。我现在有一本原始字典的副本。我可以改变副本(replaceObjectAtIndex :)并且原件不会更改。 :? – Padin215 2012-04-19 15:43:37

相关问题