8

我对查看 Apple 的文档和阅读 Cocoa 设计模式感到困惑。在 Apple 文档中copyWithZone:,它写道:

存在此方法,因此可以在需要符合 NSCopying 协议的对象的情况下使用类对象。例如,此方法允许您使用类对象作为 NSDictionary 对象的键。您不应覆盖此方法。

因为copy它写道:

对于采用 NSCopying 协议的类来说,这是一种方便的方法。如果没有 copyWithZone: 的实现,则会引发异常。

NSObject 本身不支持 NSCopying 协议。子类必须支持该协议并实现 copyWithZone: 方法。copyWithZone: 方法的子类版本应该首先向 super 发送消息,以合并其实现,除非子类直接来自 NSObject。

在 Cocoa 设计模式中的示例中,它们会覆盖copyWithZone:并且在符合协议时mutableCopyWithZone:不会覆盖。如果我想在 an 中使用我的自定义子类作为键,我应该这样做吗? copyNSCopyingNSDictionary

还是我覆盖copy

同样,如果我这样做[myClass copy],那是调用copyWithZone:还是copy我的自定义子类?谢谢。

4

2 回答 2

14

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

编辑:详细地说,您也可以实现copy,但您必须实现copyWithZone:,因为您永远不知道它们中的哪一个NSDictionary会在 iOS 6 中调用。

于 2012-02-14T18:02:05.370 回答
0

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

这对于任何方便的方法都应该是正确的。您应该找出他们调用的方法并改写它。

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

于 2015-10-15T14:28:40.170 回答