覆盖copy或copyWithZone:或两者兼而有之?

时间:2012-02-14 16:18:18

标签: iphone nscopying

我很困惑看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?感谢。

2 个答案:

答案 0 :(得分:14)

这很简单:copy的默认实现仅使用NULL参数调用copyWithZone:。所以你应该总是实现copyWithZone:。但是,由于iOS上没有使用内存区域(据我所知),您应该忽略该区域而不做任何假设。

编辑:详细说明,可能实施copy,但必须实施copyWithZone:,因为您永远不知道其中哪一个NSDictionary { {1}}将在iOS 6中调用。

答案 1 :(得分:0)

您可以继续使用超类便捷方法,因为它在任何情况下都不会调用copyWithZone:

对于任何方便的方法都应如此。您应该找出他们调用的方法并改写它。

同样如上所述,区域根本不再使用,但由于兼容性和历史原因,该方法仍具有该参数。

相关问题