是否有任何内置功能允许我深度复制NSMutableArray

我环顾四周,有人说[aMutableArray copyWithZone:nil]件作品是深度复制.但我试过了,它似乎是一个肤浅的副本.

现在我正在用for循环手动复制:

//deep copy a 9*9 mutable array to a passed-in reference array

-deepMuCopy : (NSMutableArray*) array 
    toNewArray : (NSMutableArray*) arrayNew {

    [arrayNew removeAllObjects];//ensure it's clean

    for (int y = 0; y<9; y++) {
        [arrayNew addObject:[NSMutableArray new]];
        for (int x = 0; x<9; x++) {
            [[arrayNew objectAtIndex:y] addObject:[NSMutableArray new]];

            NSMutableArray *aDomain = [[array objectAtIndex:y] objectAtIndex:x];
            for (int i = 0; i<[aDomain count]; i++) {

                //copy object by object
                NSNumber* n = [NSNumber numberWithInt:[[aDomain objectAtIndex:i] intValue]];
                [[[arrayNew objectAtIndex:y] objectAtIndex:x] addObject:n];
            }
        }
    }
}

但我想要一个更干净、更简洁的解决方案.

推荐答案

正如Apple documentation about deep copies条明确指出的那样:

如果您只需要one-level-deep份:

NSMutableArray *newArray = [[NSMutableArray alloc] 
                             initWithArray:oldArray copyItems:YES];

上面的代码创建了一个新数组,其成员是旧数组成员的浅拷贝.

请注意,如果需要深度复制整个嵌套数据 struct (链接的Apple docs称之为true deep copy),那么这种方法就不够了.请看这里的其他答案.

Objective-c相关问答推荐

Objective-C:在字符串中查找数字

如何将 NSDate 转换为今天、昨天、一周前、一个月前、一年前等相对格式?

如何为代码自动格式化设置 Xcode 插件

在 UILabel.attributedText *not* 蓝色和 *not* 下划线

在 macOS 10.9+ 上删除 plist 文件不会重置应用程序

从我在 iPhone 上的应用程序调用官方 *Settings* 应用程序

如何删除 xcode 5 中的旧配置文件?

如何保存我的 iPhone 应用程序的用户首选项?

如果目录不存在,是否有更安全的方法来创建目录?

Objective-C 中的 alloc、init 和 new

将 HTTP 标头添加到 NSURLRequest

iOS 设备作为 Web 服务器

Xcode 7 UI 测试:如何在代码中消除一系列系统alert

架构 i386 clang 的重复符号

点击手势识别器 - 哪个对象被点击了?

如何从 UIColor 对象中获取红绿蓝 (RGB) 和 alpha?

UIImageView 并不总是为模板图像着色

所有异常断点在模拟器上无缘无故停止

@synthesized 保留属性的释放是如何处理的?

info.plist 中的Application Requires iPhone Environment键是什么意思?