Objective c 可变副本通过引用而不是值复制?
显然,mutableCopy是通过引用而不是值复制的。如果我这样做:Objective c 可变副本通过引用而不是值复制?,objective-c,nsmutablearray,Objective C,Nsmutablearray,显然,mutableCopy是通过引用而不是值复制的。如果我这样做: NSMutableArray arrayA = [arrayB mutableCopy]; 然后更改arrayB的值,然后arrayA的值也将更改 我认为Java有一个clone()方法可以通过值进行复制。。在objective c中是否有一个等价物?根据苹果的文档,常规的[NSMutableArray copy]方法将返回一个“功能上独立的对象,其值与复制时的原始对象相同”。您可能应该使用它 要完全确保它是可变的,请使用[
NSMutableArray arrayA = [arrayB mutableCopy];
然后更改arrayB的值,然后arrayA的值也将更改
我认为Java有一个clone()方法可以通过值进行复制。。在objective c中是否有一个等价物?根据苹果的文档,常规的
[NSMutableArray copy]
方法将返回一个“功能上独立的对象,其值与复制时的原始对象相同”。您可能应该使用它
要完全确保它是可变的,请使用
[[NSMutableArray alloc]initWithArray:[otherArray copy]]
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
}
要深度复制阵列,您需要使用:
NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray: oldArray copyItems:YES];
这会对数组中的每个对象执行
copyWithZone:
,是的,我尝试过,但不幸的是它创建了一个异常:-[MyObject copyWithZone:]:发送到实例0x861f820的无法识别的选择器。我怀疑MyObject需要实现某种协议才能进行克隆(copyWithZone)?您需要实现NSCopying
:明白了,看起来像Java的克隆。如果我们需要新数组中元素的可变拷贝怎么办?有什么方法吗?这不是我们要问的。要制作可变副本,应使用-mutableCopy
。查看NSMutableCopying
: