仅在一个数组中创建NSMutableArray和edit元素的副本

时间:2012-12-09 10:53:06

标签: iphone ios nsmutablearray nsarray

我有两个nsmutablearray:

@property (nonatomic, strong) NSMutableArray *calSeries;
@property (nonatomic, strong) NSMutableArray *calSeries2Copy;

然后我这样做:

self.calSeries = [self getSeries];
self.calSeries2Copy = [NSMutableArray arrayWithArray:self.calSeries];

来自核心数据的getSeries方法fetchObject,但是如果我更改了calSeries中的一个元素,它也会在calSeries2Copy中更改,我如何分别创建两个数组,以便当我更改一个数组中的元素时不要更改还在另一个阵列?

2 个答案:

答案 0 :(得分:3)

试试这个,

self.calSeries2Copy = [[NSMutableArray alloc] initWithArray:self.calSeries copyItems:YES];

根据documentation,如果您已实施NSCopying协议,则应该复制。

  

标志

     

如果是,则数组中的每个对象都会收到一条copyWithZone:消息   创建对象的副本 - 对象必须符合NSCopying   协议。在托管内存环境中,这不是   保留对象否则将收到的消息。对象副本是   然后添加到返回的数组中。

     

如果为NO,则在托管内存环境中,每个对象都在数组中   只需在将其添加到返回时收到保留消息   阵列。

     

讨论

     

以这种方式初始化不可变数组后,   它无法修改。

     

copyWithZone:方法执行浅拷贝。如果你有   任意深度的集合,为flag参数传递YES   执行表面下第一级的不可变副本。如果你   传递NO第一级的可变性不受影响。在任何一个   在这种情况下,所有更深层次的可变性都不会受到影响。

答案 1 :(得分:0)

默认情况下复制数组只会生成浅拷贝。这意味着复制了数组,但元素只能再次保留

使用[[NSMutableArray alloc] initWithArray:srcArray copyItems:YES];复制项目以获得深层复制,其中还复制了每个元素