我很难理解 copyWithZone。
我知道它应该返回一个副本,但是如果我将一个对象添加到字典中,它会向字典中添加一个“copyWithZone”对象。如果我制作一个实际的副本(即一个新对象),那么添加到字典中的对象将不是同一个对象。但是,如果我只增加保留计数,那么从技术上讲它就不是副本。
我应该保留自己,还是制作一个实际的副本?
最佳答案
copyWithZone:
应该返回一个不可变对象(immutable对象)(如果该类有不可变和可变版本)。如果原始对象是不可变的,那么简单地保留并返回原始对象是安全的,因为没有一个所有者可以改变该对象。否则(即原始文件是可变的或不可变/可变二分法不适用),返回副本。
对于 NSDictionary
和 NSMutableDictionary
,通常仅复制键(仅当您使用 -initWithDictionary:copyItems:
明确指定时才复制项目),这是必要的,因为字典的内部数据结构取决于键值。如果您要更改字典使用的键,则会破坏字典的数据结构,并且您将无法再检索该键的项目,甚至更糟。
关于objective-c - NSCopying 和 copyWithZone : - should they return [self retain] or something else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488038/