【问题标题】:NSMutableArray of custom classes copy自定义类副本的 NSMutableArray
【发布时间】:2012-10-30 00:09:31
【问题描述】:

我有一个 NSMutableArray 的自定义对象(基于 NSObject),我想将其复制到一个新数组中。但我希望它是一个深拷贝。

我该怎么做呢?我需要在我的自定义对象中实现 NSCopying 协议吗?

谢谢

【问题讨论】:

    标签: objective-c nsmutablearray copy nsarray deep-copy


    【解决方案1】:

    是的,您需要指出您的自定义类遵循NSCopying 协议,然后您实现copyWithZone: 方法。这允许复制您的课程。在copyWithZone: 的实现中,您需要确定有多少内部结构还需要深度复制。

    现在,如果您对数组进行深拷贝,新数组将包含对象的复制版本,而不仅仅是对原始对象的引用。

    请注意,数组的常规副本不会进行深度复制。要制作深层副本,您需要以下内容:

    NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
    

    【讨论】:

    • 不,在数组上调用 copy 不会进行深拷贝,无论包含的元素实现什么协议
    • @Eiko 我从来没有说过在数组上调用copy 会进行深层复制。我说明了如何确保自定义对象是可复制的。然后我提到如果制作了数组的深层副本...
    • @maddy 嗯好吧,我认为“现在如果你对数组进行深拷贝,......”很容易被误解。
    • 那么如何进行深度复制呢?它是这些类的一部分,还是需要像我在网上看到的那样在一个类别中实现?
    • @Eiko 在你编辑我的答案之前给我一分钟做出改变。
    【解决方案2】:

    可以通过手动遍历所有元素来深度复制数组。如果对象需要进一步的深度复制,这是必要的。

    NSMutableArray *deepCopied = [NSMutableArray arrayWithCapacity:[array count]];
    
    // assumes your objects know how to "deepCopy"    
    for (id object in array)
    {
        // if not ARC or GC:
        [deepCopied addObject:[[object deepCopy] aurorelease]];
    
        // if ARC or GC
        [deepCopied addObject:[object deepCopy]];
    }
    

    否则:

    NSArray *deepCopied = [[NSArray alloc] initWithArray:array copyItems:YES];
    

    答案here 中描述了一种分类方法,如果您需要制作大量深拷贝,可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多