我很难理解copyWithZone。
我知道它应该返回一个副本,但如果我将一个对象添加到字典中,它会在字典中添加一个'copyWithZone'对象。如果我创建一个实际的副本(即一个新对象),那么添加到字典中的对象将不是同一个对象。但是,如果我只增加保留计数,那么它在技术上不是副本。
我应该保留自己,还是制作实际副本?
答案 0 :(得分:2)
copyWithZone:
应该返回一个不可变对象(如果有类的不可变和可变版本)。如果原件是不可变的,只需保留&返回原件是安全的,因为没有所有者可以改变对象。否则(即原始是可变的或不可变/可变的二分法不适用),返回副本。
对于NSDictionary
和NSMutableDictionary
,通常只复制密钥(只有在明确说明-initWithDictionary:copyItems:
时才会复制项目),这是必要的内部数据结构。字典取决于键值。如果您要改变字典使用的密钥,它将破坏字典的数据结构,您将无法再检索该密钥的项目,或者更糟。