我很困惑看Apple的文档和阅读Cocoa设计模式。在copyWithZone:
的Apple文档中,它显示为:
此方法存在,因此类对象可用于其中的情况 你需要一个符合NSCopying协议的对象。对于 例如,此方法允许您使用类对象作为键的对象 NSDictionary对象。您不应该覆盖此方法。
对于copy
,它显示为:
这是采用NSCopying的类的便捷方法 协议。如果没有实现,则会引发异常 copyWithZone:
NSObject本身不支持NSCopying协议。子类 必须支持协议并实现copyWithZone:方法。一个 copyWithZone:方法的子类版本应该发送消息 超级首先,要包含它的实现,除非是子类 直接从NSObject下载。
在Cocoa设计模式的示例中,它们会覆盖copyWithZone:
和mutableCopyWithZone:
,但在符合copy
协议时不会覆盖NSCopying
。如果我想在NSDictionary
中使用我的自定义子类作为键,那该怎么办?
或者我是否覆盖copy
?
同样,如果我执行[myClass copy]
,是否会为我的自定义子类调用copyWithZone:
或copy
?感谢。
答案 0 :(得分:14)
这很简单:copy
的默认实现仅使用NULL参数调用copyWithZone:
。所以你应该总是实现copyWithZone:
。但是,由于iOS上没有使用内存区域(据我所知),您应该忽略该区域而不做任何假设。
编辑:详细说明,可能实施copy
,但必须实施copyWithZone:
,因为您永远不知道其中哪一个NSDictionary
{ {1}}将在iOS 6中调用。
答案 1 :(得分:0)
您可以继续使用超类便捷方法,因为它在任何情况下都不会调用copyWithZone:
。
对于任何方便的方法都应如此。您应该找出他们调用的方法并改写它。
同样如上所述,区域根本不再使用,但由于兼容性和历史原因,该方法仍具有该参数。