据说通过编辑副本将被污染的 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.editContents
和 self.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 级拷贝),您需要自己编写代码。
我有一个带有一些 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.editContents
和 self.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 级拷贝),您需要自己编写代码。