【问题标题】:Questions about duplicating last object of a NSArray关于复制 NSArray 的最后一个对象的问题
【发布时间】:2011-09-26 07:45:41
【问题描述】:

我有一个 MyObjects 的 NSArray。

我想复制数组的最后一个对象。换句话说,我想在数组中添加一个与上一个完全相同的新对象。

我试过了:

id object = [[self arrangedObjects] lastObject]; 
id newObject = [object copy];

但我意识到我不能使用复制方法,因为它没有在 NSObject 中实现。

我是否应该在 MyObject 类中实现复制方法,返回一个新的 MyObject 实例并更改代码如下:

MyObject object = [[self arrangedObjects] lastObject]; 
MyObject newObject = [object copy];

或者还有其他解决方案吗?

更新 来自 NSObject 文档

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

【问题讨论】:

    标签: objective-c nscopying


    【解决方案1】:

    如果你的对象是 NSObject,你可以创建一个新的 NSObject 类别来实现 NSCopying 协议。确保遍历所有键并将它们的值复制到新对象。对于深度复制,您还应该在其每个值对象上调用“复制”。

    如果您的对象是自定义的,请在其类中实现协议。

    如果数组中有混合对象,它们都必须实现 NSCopying 协议,因此您可以在声明它们时使用 id<NSCopying> 以避免编译时警告/错误。

    【讨论】:

      【解决方案2】:

      据我所知,如果你想复制一个对象,请实现NSCopying 协议,它可以让你使用NSObject - (id)copy 方法。

      - (id)copyWithZone:(NSZone *)zone 方法中,使用+ (id)allocWithZone:(NSZone *)zone 分配一个新对象,然后复制其成员、更新其状态等等

      【讨论】:

      • 它说选择器副本无法识别。我在 NSObject 复制文档中发现了这一点: NSObject 本身不支持 NSCopying 协议。子类必须支持该协议并实现 copyWithZone: 方法。 copyWithZone: 方法的子类版本应该首先向 super 发送消息,以合并其实现,除非子类直接来自 NSObject。
      • 文档说:如果没有 copyWithZone: 的实现,则会引发异常。那一定是你无法识别的选择器:) NSObject 必须做额外的验证
      • 回答我的问题.. 我不能将副本与 NSObject 一起使用,但我需要对其进行子类化并在我实现 NSCopying 协议的地方使用 MyObject 类。正确吗?
      • 是的,在 MyObject 类中实现 NSCopying 协议,它将是可复制的 :)
      • 如果我的数组中有来自不同类的对象并且我需要使用 "id" 怎么办?在这种情况下如何复制最后一个对象?
      猜你喜欢
      • 2012-02-26
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多