我有一个带有一些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?),数字也不会重置。我尝试在两个数组中输出相同位置的值,结果发现对活动数组所做的任何更改都会污染干净的数组。
答案 0 :(得分:2)
copy
执行浅拷贝。换句话说,self.editContents
和self.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级复制),您需要自己编写代码。