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