Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 可变副本通过引用而不是值复制?_Objective C_Nsmutablearray - Fatal编程技术网

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

Objective c 可变副本通过引用而不是值复制?,objective-c,nsmutablearray,Objective C,Nsmutablearray,显然,mutableCopy是通过引用而不是值复制的。如果我这样做: NSMutableArray arrayA = [arrayB mutableCopy]; 然后更改arrayB的值,然后arrayA的值也将更改 我认为Java有一个clone()方法可以通过值进行复制。。在objective c中是否有一个等价物?根据苹果的文档,常规的[NSMutableArray copy]方法将返回一个“功能上独立的对象,其值与复制时的原始对象相同”。您可能应该使用它 要完全确保它是可变的,请使用[

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

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