objective-c - NSCopying 和 copyWithZone : - should they return [self retain] or something else?

标签 objective-c cocoa retain nscopying copywithzone

我很难理解 copyWithZone。

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

我应该保留自己,还是制作一个实际的副本?

最佳答案

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

对于 NSDictionaryNSMutableDictionary,通常仅复制键(仅当您使用 -initWithDictionary:copyItems: 明确指定时才复制项目),这是必要的,因为字典的内部数据结构取决于键值。如果您要更改字典使用的键,则会破坏字典的数据结构,并且您将无法再检索该键的项目,甚至更糟。

关于objective-c - NSCopying 和 copyWithZone : - should they return [self retain] or something else?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488038/

相关文章:

iphone - 内存泄漏问题

ios - UITableViewCell 中的 UILabel - 切断信息

cocoa - 如何在仍然使用 NSArrayController 的同时直接响应 NSTableView 编辑?

swift - 需要帮助将 (CFPropertyListRef *)nsdictionary 转换为 swift

ios - MMDrawerViewController 设置

cocoa - NSOperation main 中的 NSAutoreleasePool?

cocoa - 如何处理 NSTableView 中非常大的 CoreData 存储?

ios - 在 iOS 上阻止保留

iphone - @property 保留 - iPhone

java - 在Fragment切换中保留数据