1

我有一个NSMutableDictionary被调用source的,然后我以这种方式创建另一个:

NSMutableDictionary *new = [source copy];

但是当我修改new's 值之一时, 's 的值source也会被修改。这是为什么?

4

3 回答 3

4

问题是 iOS(和 OSX)使用浅拷贝。这意味着新集合中的对象与原始集合中的对象相同。正如@danDedo 在他的回答中所说,您的副本是不可变的 - 它是一个字典而不是可变字典(因此您无法添加或删除对象)。但是对象是一样的。因此,如果这些对象本身是可变的,那么一处的更改将影响所有引用(即副本中的所有对象)。

解决这个问题的方法是编写自己的“深拷贝”(如果需要的话)——您肯定可以在此处找到搜索“深拷贝”的示例。

于 2012-08-04T01:29:35.830 回答
2

您创建了集合的副本,但集合包含指向对象的指针。因此,新副本也只保存指向对象的指针(称为浅拷贝)。

打印出两个字典,你可以看到它们都持有相同的指针。

此外,您的“副本”不是 MutableArray ...您需要为此使用 mutableCopy。

于 2012-08-04T01:31:47.947 回答
0

您正在将消息副本发送给接收者,您不应该发送 mutableCopy 来创建可变字典吗?我很惊讶当你试图改变这个对象时没有抛出异常。

于 2012-08-04T01:18:39.093 回答