2012-06-29 58 views
4

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

NSMutableArray arrayA = [arrayB mutableCopy]; 

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

我觉得Java有一个克隆()方法来复制值..是否有一个等价的目标c?

回答

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 
} 
+0

是的,我试过,但不幸的是它创建了一个exceptioN: - [MyObject copyWithZone:]:无法识别的选择器发送到实例0x861f820。我怀疑MyObjects需要实现一些协议才能克隆(copyWithZone)? – yroc

+0

你需要实现'NSCopying':https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/Reference/Reference.html – hypercrypt

+0

了解它,看起来像Java的克隆。 – yroc

-1

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

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

+0

这不是问什么问题。为了制作一个可变副本,你应该使用'-mutableCopy'。看看'NSMutableCopying':https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSMutableCopying_Protocol/Reference/Reference.html – hypercrypt

0

要深拷贝,你需要使用一个数组:

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

这对阵列中的每个对象执行copyWithZone: