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