【问题标题】:Override copy or copyWithZone: or both?覆盖 copy 或 copyWithZone: 或两者兼而有之?
【发布时间】:2012-02-14 16:18:17
【问题描述】:

我对查看 Apple 的文档和阅读 Cocoa 设计模式感到困惑。在copyWithZone: 的 Apple 文档中,内容如下:

此方法存在,因此类对象可以在以下情况下使用 你需要一个符合 NSCopying 协议的对象。为了 例如,此方法允许您使用类对象作为 NSDictionary 对象。你不应该重写这个方法。

copy 的内容如下:

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

NSObject 本身不支持 NSCopying 协议。子类 必须支持协议并实现 copyWithZone: 方法。一种 copyWithZone: 方法的子类版本应该发送消息 to super first, 合并它的实现,除非子类 直接从 NSObject 继承。

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

或者我是否覆盖copy

同样,如果我使用[myClass copy],是否会为我的自定义子类调用copyWithZone:copy?谢谢。

【问题讨论】:

    标签: iphone nscopying


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2015-10-14
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多