为了账号安全,请及时绑定邮箱和手机立即绑定

深度复制NSArray

深度复制NSArray

暮色呼如 2019-08-31 11:11:51
是否有任何内置功能可以让我深层复制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];            }        }    }}但我想要一个更清洁,更简洁的解决方案。
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

正如Apple文档所述,


如果您只需要一个级别深的副本,您可以明确地要求一个...


NSMutableArray *newArray = [[NSMutableArray alloc] 

                             initWithArray:oldArray copyItems:YES];

上面的代码创建了一个新数组,其成员是旧数组成员的浅表副本。


请注意,如果您需要深度复制整个嵌套数据结构 - 链接的Apple文档称之为“真正的深层副本” - 那么这种方法是不够的 - 请参阅此处的其他答案。


查看完整回答
反对 回复 2019-08-31
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

我知道轻松做到这一点的唯一方法是归档然后立即取消归档你的数组。这感觉有点像黑客,但实际上在Apple文档中明确建议复制集合,其中指出:


如果您需要真正的深层副本,例如当您拥有阵列数组时,只要内容全部符合NSCoding协议,您就可以归档然后取消归档该集合。清单3显示了这种技术的一个例子。


清单3真正的深层副本

NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:

          [NSKeyedArchiver archivedDataWithRootObject:oldArray]];

问题是您的对象必须支持NSCoding接口,因为这将用于存储/加载数据。


Swift 2版本:

let trueDeepCopyArray = NSKeyedUnarchiver.unarchiveObjectWithData(

    NSKeyedArchiver.archivedDataWithRootObject(oldArray))


查看完整回答
反对 回复 2019-08-31
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

默认情况下复制会生成浅表副本

这是因为调用与使用默认区域进行复制copy相同copyWithZone:NULL。该copy调用不会导致深层复制。在大多数情况下,它会给你一个浅的副本,但无论如何它取决于类。有关详细讨论,我建议Apple Developer站点上的Collections Programming Topics。


initWithArray:CopyItems:提供一个级别的深层副本

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

NSCoding 是Apple推荐的提供深层复制的方式

对于真正的深层副本(数组数组),您将需要NSCoding并归档/取消归档对象:


NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];



查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 697 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信