据说通过编辑副本将被污染的 NSArray 分开

Supposedly separate NSArray being contaminated by editing a copy

我有一个带有一些 TextField 的 TableView。所述 TextFields 的值链接到二维数组(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(可能是矫枉过正?可能),数字也不会重置。我尝试在两个数组中输出相同位置的值,结果发现对活动数组所做的任何更改都会污染干净的数组。

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

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

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

听起来您期待的是深拷贝

copy 方法执行浅拷贝,即它只复制数组而不是 in[= 中的项的副本24=]数组。

因此,当您执行 [self.cleanEditContents copy] 时,新数组 共享 与原始数组完全相同的项目。

如果您需要深拷贝(或者可能只是一个 2 级拷贝),您需要自己编写代码。