NSCopying 和 copyWithZone: - 它们应该返回 [self keep] 还是其他东西?
我很难理解 copyWithZone。
我知道它应该返回一个副本,但是如果我将一个对象添加到字典中,它会向字典中添加一个“copyWithZone”对象。如果我制作一个实际的副本(即一个新对象),那么添加到字典中的对象将不是同一个对象。但是,如果我只增加保留计数,那么它在技术上就不是副本。
我应该保留自己,还是制作一个实际的副本?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
copyWithZone:
应该返回一个不可变对象(如果该类有不可变和可变版本)。如果原始内容是不可变的,只需保留 &返回原始对象是安全的,因为没有一个所有者可以改变该对象。否则(即原始是可变的或不可变/可变二分法不适用),返回一个副本。至于
NSDictionary
和NSMutableDictionary
,通常仅复制键(仅当您使用-initWithDictionary:copyItems:
),这是必要的,因为内部字典的数据结构取决于键值。如果您要更改字典使用的键,则会破坏字典的数据结构,并且您将无法再检索该键的项目,甚至更糟。copyWithZone:
is supposed to return an immutable object (if there are immutable and mutable versions of the class). If the original is immutable, simply retaining & returning the original would be safe, since none of the owners could mutate the object. Otherwise (i.e. original is mutable or the immutable/mutable dichotomy doesn't apply), return a copy.As for
NSDictionary
andNSMutableDictionary
, generally only the keys are copied (items are only copied if you explicitly say to with-initWithDictionary:copyItems:
), which is necessary as the internal data structure of the dictionary depends on the key values. If you were to mutate a key being used by a dictionary, it would corrupt the dictionary's data structure and you would no longer be able to retrieve the item for that key, or worse.