gpt4 book ai didi

Objective-C:复制数组,仅在复制中修改元素(对象)

转载 作者:太空狗 更新时间:2023-10-30 03:57:10 26 4
gpt4 key购买 nike

在问这个问题之前,我已经通读了许多 SO 帖子,我猜这个答案就在某个地方,但我没有看到它。我是 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 协议(protocol),您可以这样做:

NSMutableArray *copy = [[NSMutableArray alloc] initWithArray:originalArray copyItems:YES];

这具有将 copy 发送到原始数组的每个元素的效果,并将副本存储在新数组中。

如果每个元素在收到 copy 消息时都返回一个新的可变副本,这很好。但是,一些基础类(如 NSMutableArrayNSMutableString)在收到 copy 消息时会返回不可变副本。如果您的元素属于此类,则需要发送 mutableCopy 消息。

没有内置的公共(public)消息可以做到这一点。您可以像这样手动完成:

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

关于Objective-C:复制数组,仅在复制中修改元素(对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com