显然mutableCopy通过引用复制,而不是值。即如果我这样做:可变拷贝通过引用拷贝,不是值?
NSMutableArray arrayA = [arrayB mutableCopy];
然后更改arrayB的值,然后arrayA的值也将更改。
我觉得Java有一个克隆()方法来复制值..是否有一个等价的目标c?
显然mutableCopy通过引用复制,而不是值。即如果我这样做:可变拷贝通过引用拷贝,不是值?
NSMutableArray arrayA = [arrayB mutableCopy];
然后更改arrayB的值,然后arrayA的值也将更改。
我觉得Java有一个克隆()方法来复制值..是否有一个等价的目标c?
mutableCopy
方法执行“浅”复制。 arrayA
的每个元素都是对arrayB
中的对象的引用。如果您将元素添加到arrayA
(或删除元素),则arrayB
将保持不变,反之亦然。但由于arrayA
和arrayB
的元素引用了相同的对象,因此对这两个对象中的某个对象的更改“显示”出来。
如果你想的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
}
根据Apple的文档,常规的[NSMutableArray copy]
方法将返回一个“功能独立的对象,其值与复制时的原始值相同”。你应该使用它。
要完全确定它是可变的,请使用[[NSMutableArray alloc] initWithArray:[otherArray copy]]
。
这不是问什么问题。为了制作一个可变副本,你应该使用'-mutableCopy'。看看'NSMutableCopying':https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSMutableCopying_Protocol/Reference/Reference.html – hypercrypt
要深拷贝,你需要使用一个数组:
NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray: oldArray copyItems:YES];
这对阵列中的每个对象执行copyWithZone:
是的,我试过,但不幸的是它创建了一个exceptioN: - [MyObject copyWithZone:]:无法识别的选择器发送到实例0x861f820。我怀疑MyObjects需要实现一些协议才能克隆(copyWithZone)? – yroc
你需要实现'NSCopying':https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/Reference/Reference.html – hypercrypt
了解它,看起来像Java的克隆。 – yroc