可变副本通过引用复制,而不是值?

时间:2012-06-29 23:20:47

标签: objective-c nsmutablearray

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

NSMutableArray arrayA = [arrayB mutableCopy];

然后更改arrayB的值,然后也会更改arrayA的值。

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

3 个答案:

答案 0 :(得分: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  
}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-1)

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

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