【发布时间】:2010-10-13 10:23:54
【问题描述】:
是否有任何内置函数可以让我深度复制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];
}
}
}
}
但我想要一个更简洁、更简洁的解决方案。
【问题讨论】:
-
@Genericrich 深拷贝和浅拷贝是软件开发中定义明确的术语。 Google.com 可能会有所帮助
-
可能有些混乱是因为
-copy在不可变集合上的行为在 Mac OS X 10.4 和 10.5 之间发生了变化:developer.apple.com/library/mac/releasenotes/Cocoa/…(向下滚动到“不可变集合和复制行为”)跨度> -
@AndrewGrant 经过进一步思考,恕我直言,我不同意 deep copy 是一个定义明确的术语。根据您阅读的来源,不清楚是否无限递归到嵌套数据结构是“深度复制”操作的要求。换句话说,对于创建其成员是原始对象成员的浅拷贝的新对象的复制操作是否是“深拷贝”操作,您将得到相互矛盾的答案。请参阅stackoverflow.com/a/6183597/1709587 以了解对此的一些讨论(在 Java 上下文中,但它仍然是相关的)。
-
@AndrewGrant 我必须支持@MarkAmery 和@Genericrich。如果集合中使用的根类及其所有元素都是可复制的,则深度复制是明确定义的。 NSArray(和其他 objc 集合)不是这种情况。如果一个元素没有实现
copy,应该把什么放入“深拷贝”?如果元素是另一个集合,copy实际上不会产生(同一类的)副本。所以我认为在特定情况下争论想要的副本类型是完全正确的。 -
@NikolaiRuhe 如果一个元素没有实现
NSCopying/-copy,那么它是不可复制的——所以你永远不应该尝试复制它,因为这不是它设计的能力拥有。就 Cocoa 的实现而言,不可复制的对象通常具有一些与之相关的 C 后端状态,因此破解对象的直接副本可能会导致竞争条件或更糟。所以要回答“应该在‘深拷贝’中放入什么”——保留的参考。当你有一个非NSCopying对象时,你唯一可以放在任何地方的东西。
标签: objective-c cocoa-touch cocoa nsarray deep-copy