据说通过编辑副本将NSArray分开

时间:2015-01-05 18:25:31

标签: ios objective-c arrays nsarray

我有一个带有一些TextFields的TableView。所述TextFields的值链接到2D数组中的某些位置(NSMutableArrays的NSArray)。

初始清理数组的定义如下:

self.cleanEditContents = @[
                      [@[@-1,@-1] mutableCopy],
                      [@[@0,@80] mutableCopy],
                      [@[@0,@500] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy],
                      [@[@-1,@-1] mutableCopy]
                      ];

该数组应该与'active'数组保持独立,这样可以在按下按钮时重置活动数组。

我使用self.editContents = [self.cleanEditContents copy];在填充干净数组之后和按下按钮时直接设置活动数组。

有一个问题,即使我重置数组并调用reloadData和setNeedsLayout(可能是overkill?),数字也不会重置。我尝试在两个数组中输出相同位置的值,结果发现对活动数组所做的任何更改都会污染干净的数组。

2 个答案:

答案 0 :(得分:2)

copy执行浅拷贝。换句话说,self.editContentsself.cleanEditContents都引用同一组可变数组。因此,如果您在一个中更新可变数组,则可以在另一个中看到更改。

要创建self.editContents,请创建一个包含内部数组的可变副本的新数组。

NSMutableArray *tmp = [NSMutableArray array];
for (NSArray *array in self.cleanEditContents) {
    [tmp addObject:[array mutableCopy]];
}
self.editContents = tmp;

答案 1 :(得分:2)

听起来你期待深层复制

copy方法执行浅层复制,即只创建数组的副本,而不是数组中的项。

因此当您[self.cleanEditContents copy]新数组分享与原始数据完全相同时。

如果您需要深层复制(或者只是2级复制),您需要自己编写代码。