我有NSMutableDictionary
名为source
,然后我以这种方式创建另一个:
NSMutableDictionary *new = [source copy];
但是当我修改其中一个new
的值时,source
的值也会被修改。那是为什么?
答案 0 :(得分:4)
问题是iOS(和OSX)使用浅拷贝。这意味着新集合在其中具有与原始集合相同的对象。正如@danDedo在他的回答中所说,你的副本是不可变的 - 它是一个字典而不是一个可变字典(所以你不能添加或删除对象)。但是对象是一样的。因此,如果这些对象本身是可变的,那么一个地方的更改将影响所有引用(即副本中的所有对象)。
解决方案是编写自己的“深层复制”(如果需要) - 您可以在这里找到搜索“深层复制”的示例。
答案 1 :(得分:2)
您创建了该集合的副本,但该集合包含指向对象的指针。因此,新副本也只保存指向对象的指针(称为浅副本)。
打印出两个字典,你可以看到它们都有相同的指示。
另外,你的“副本”不是MutableArray ......你需要使用mutableCopy。
答案 2 :(得分:0)
您正在将消息副本发送给接收方,您是否应该发送mutableCopy来创建可变字典?我很惊讶当你试图改变这个对象时没有抛出异常。