4

显然 mutableCopy 通过引用而不是值复制。即如果我这样做:

NSMutableArray arrayA = [arrayB mutableCopy];

然后改变arrayB的值,那么arrayA的值也会改变。

我认为Java有一个按值复制的 clone() 方法。在目标 c 中是否有等价物?

4

3 回答 3

6

mutableCopy方法执行“浅”复制。的每个元素arrayA都是对也在 中的对象的引用arrayB。如果添加元素arrayA(或移除元素),arrayB将保持不变,反之亦然。但是由于arrayAarrayB引用相同对象的元素,对这些对象之一的更改“显示”在两个数组中。

如果您想要 的一级深层副本arrayB,您可以这样做:

NSMutableArray *arrayA = [[NSMutableArray alloc] initWithArray:arrayB copyItems:YES];

这将产生这样的效果:

NSMutableArray *arrayA = [[NSMutableArray alloc] init];
for (id element in arrayB) {
    [arrayA addObject:[element copy]]; //copies immutable objects to new array  
}
于 2012-06-29T23:30:15.840 回答
0

要深度复制数组,您需要使用:

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

copyWithZone:对数组中的每个对象执行

于 2012-06-29T23:38:05.393 回答
-1

根据 Apple 的文档,常规[NSMutableArray copy]方法将返回一个“功能独立的对象,其值与制作副本时的原始值相同”。您可能应该只使用它。

要完全确定它是可变的,请使用[[NSMutableArray alloc] initWithArray:[otherArray copy]].

于 2012-06-29T23:29:15.177 回答