复制的NSMutableDictionary不可变

时间:2012-04-18 20:52:43

标签: objective-c ios 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];

它运行得很好。为什么我的复制版本打破了它?

1 个答案:

答案 0 :(得分:6)

mutableCopy执行可变副本。它不会使字典中的不可变对象变得可变。

你需要实现 - 是的,实现,因为它不是API的一部分,原因有很多 - 深度可变复制,如果这是你需要的。

或者,如果您的字典可以表示为属性列表,则可以将其转换为一个,然后使用各种选项参数在未归档时生成可变集合和/或离开。