Objective c 目标C:复制数组,仅修改副本中的元素(对象)

Objective c 目标C:复制数组,仅修改副本中的元素(对象),objective-c,nsmutablearray,nsarray,Objective C,Nsmutablearray,Nsarray,在问这个问题之前,我已经阅读了很多帖子,我猜答案就在那里的某个地方,但我没有看到。我是Objective-C的新手,我正在尝试做一个(看似)简单但我无法理解的动作 一般的想法是我有一个NSArray填充了对象(特别是UIImageView类型)。我想复制这个数组,我用了很多方法(都很成功) 复制它之后,我现在有两个数组。我想修改一个对象,比如在索引2中,只修改副本中的 到目前为止,似乎是这样的,因为副本只是复制引用(或指针),更改索引2处的对象将同时更改副本和原始中的对象 这有意义吗 NSArr

在问这个问题之前,我已经阅读了很多帖子,我猜答案就在那里的某个地方,但我没有看到。我是Objective-C的新手,我正在尝试做一个(看似)简单但我无法理解的动作

一般的想法是我有一个
NSArray
填充了对象(特别是
UIImageView
类型)。我想复制这个数组,我用了很多方法(都很成功)

复制它之后,我现在有两个数组。我想修改一个对象,比如在索引2中,只修改副本中的

到目前为止,似乎是这样的,因为副本只是复制引用(或指针),更改索引2处的对象将同时更改副本和原始中的对象

这有意义吗

NSArray *originalArray = @[object1, object2];
我尝试复制此阵列的方法,以便实现我想要的:

NSMutableArray *originalArrayCopy = [NSMutableArray arrayWithArray:originalArray];

NSArray *originalArrayCopy = [originalArray copy];

NSMutableArray *originalArrayCopy = [[NSMutableArray alloc] initWithArray:originalArray];
似乎在每种情况下,从副本修改对象也会修改原始对象


注意:虽然
NSArray
显然是不可变的,但我的原始数组中的对象是可变的。

是的,所有这些都只会复制数组。复制的数组仍将引用相同的对象

我不认为(或只是不知道如何)可以一次性复制所有包含的对象。我猜您必须遍历原始数组中的对象,复制每个对象,并将其副本添加到新创建的、最初为空的可变数组中。 如何复制这些对象在很大程度上取决于这些对象的性质以及复制它们的目的


是的,没有理由不可变数组中的对象也不可变

如果数组元素符合
NSCopying
协议,则可以执行以下操作:

NSMutableArray *copy = [[NSMutableArray alloc] initWithArray:originalArray copyItems:YES];
这可以将
copy
发送到原始数组的每个元素,并将副本存储在新数组中

如果每个元素在接收到
copy
消息时返回一个新的、可变的副本,则可以这样做。但是,几个基础类(如<代码> NSMutableArray < /COD>和<代码> NSMutable Stords<代码>)在收到<代码>拷贝< /> >消息时返回不可变的副本。如果元素属于此类,则需要发送
mutableCopy
消息

没有内置的公共消息可以做到这一点。您可以这样手动执行:

NSMutableArray *copy = [[NSMutableArray alloc] initWithCapacity:originalArray.count];
for (id element in originalArray) {
    [copy addObject:[element mutableCopy]];
}

这会将第一个NSArray的深度副本复制到第二个NSMutableArray中:

NSArray *firstArray = [NSArray arrayWithObjects:@"foo", @"bar",nil];
NSMutableArray *secondArray = [[NSMutableArray alloc]initWithArray:firstArray copyItems:YES];

只要要复制的对象实现NSCoding协议

(void)encodeWithCoder:(NSCoder *)encoder;
(id)initWithCoder:(NSCoder *)decoder;
你可以用这种方法制作任何对象的深度副本

NSArray *originalArray = @[object1, object2];
NSMutableArray *deepCopy = [NSkeyedUnarchiver unarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject: originalArray]];

是的,第二种解决方案是有意义的。但是,我在问题中犯了一个错误,因为我没有指定原始数组中的元素是UIImageView类型。我知道这会让事情变得更具挑战性。尝试第二种解决方案时,我收到错误:
NSInvalidArgumentException[UIImageView mutableCopywithZone:
每个UIImageView对象都是我的一个类的属性。请编辑您的问题,解释为什么要复制图像视图。您将把它们放在视图层次结构中的什么位置?是的,谢谢。虽然我的问题仍然适用,但我“需要”复制
UIImageView
实例的方式只是我的一个设计缺陷。第二个解决方案对我有效。但我仍然怀疑,当我们使用NSMutableArray*copy=[originalArray mutableCopy]时,它不起作用;