0

我很难理解 copyWithZone。

我知道它应该返回一个副本,但是如果我将一个对象添加到字典中,它会在字典中添加一个“copyWithZone”对象。如果我制作一个实际的副本(即一个新对象),那么添加到字典中的对象将不是同一个对象。但是,如果我只增加保留计数,那么从技术上讲它不是副本。

我应该保留自我还是制作实际副本?

4

1 回答 1

2

copyWithZone:应该返回一个不可变对象(如果该类有不可变和可变版本)。如果原件是不可变的,那么简单地保留并返回原件是安全的,因为没有一个所有者可以改变对象。否则(即原始是可变的或不可变/可变二分法不适用),返回一个副本。

至于NSDictionaryand NSMutableDictionary,通常只复制键(只有当你明确说 with 时才会复制项目-initWithDictionary:copyItems:),这是必要的,因为字典的内部数据结构取决于键值。如果您要更改字典正在使用的键,它会破坏字典的数据结构,并且您将不再能够检索该键的项目,或者更糟。

于 2011-09-20T17:09:33.043 回答