addEntriesFromDictionary:一个真正的复制方法?

时间:2011-08-03 18:09:51

标签: objective-c

我正在努力了解这种方法究竟发生了什么,如Apple文档中所述:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html

如果我创建NSMutableDicationary并使用addEntriesFromDictionary:来填充它,我可以对这个可变字典做任何我想做的事情,而不会影响这些项目所在的原始不可变字典吗?

3 个答案:

答案 0 :(得分:3)

是的,您对新词典所做的修改不会影响旧词典。但是,您对字典里面的字符所做的任何更改都会影响原始字典中的对象。毕竟,它们是相同的对象。正如文档所说:

  

otherDictionary 中的每个值对象在添加到接收字典之前都会发送 retain 消息。相反,每个密钥对象都被复制......并且副本被添加到接收字典中。

答案 1 :(得分:3)

您可以通过记录键和值的地址来自行检查。我的猜测是它复制了密钥,标准NSDictionary行为也是如此,只是保留了这些值。您可以根据需要改变字典(它只包含key->值映射),但是如果您改变其的对象,那么您将成为在任何地方改变这些对象。

编辑:根据建议记录测试用例确实表明这是行为。实际上,复制的密钥与不可变字符串密钥的常见情况的原始密钥相同。

答案 2 :(得分:3)

原始字典不会被修改。 然而,如果原始字典的键或值本身是可变的(例如它们是UIViewNSMutableArray的实例)并且您修改它们,那么更改将反映在原始字典中。

为避免这种情况,请在将原始字典添加到新字典之前制作原始字典的深层副本:

NSDictionary *deepCopy = [[NSDictionary alloc] initWithDictionary: original copyItems: YES];
if (deepCopy) {
    [destination addEntriesFromDictionary: deepCopy];
    [deepCopy release];
}