我需要一份副本NSArray
来存储日期状态。我尝试使用mytableCopy
我了解的使副本与原始对象无关的副本。
当我进行更改mutableCopy
时,原始数组中也会发生更改。
为什么?
我的代码是:
_nsarr = [[NSArray alloc] initWithArray:inputArray];
_nsMraa= [NSMutableArray alloc];
_nsMraa = [_nsarr mutableCopy];
注意:这两个数组都是我对象的属性。inputArray
是输入参数,此后不使用。
备注:一个对象是NSArray
,另一个是NSMutableArray
正如巴拉特(Bharat)和米兰(Milan)NSArray
所指,是引用类型的数组,它包含一个指针数组。调用mutableCopy
将创建该数组的浅表副本,并使该副本可变,原始副本仍将是不可更改的。但是,对阵列的内容都mutableCopy
不会copy
执行深层复制。是可变的阵列,而不是可变的阵列,而不是数组中保存的对象的目录。
假设以下内容:
@interface MyObject
- (int) state;
- (void) setState:(int) state;
@end
...
_nsarr = [NSArray arrayWithObject:[[MyObject alloc] initWithState]];
_nsmarr = [_nsarr mutableCopy];
此时,您有两个不同的数组,_nsarr
和_nsmarr
,一个不是可变的,一个是HOWEVER,_nsarr[0]
并且_nsmarr[0]
仍然是同一对象,这意味着它们[_nsarr[0] setState:1]
都是有效的,并且具有与[_nsmarr[0] setState:1]
[_nsarr[0] setState:1];
NSLog("%d", [_nsmarr[0] state]); // ==> 1
[_nsarr[0] setState:2];
NSLog("%d", [_nsmarr[0] state]); // ==> 2
要复制数组中包含的各个对象,您需要创建该数组的“深层”副本,这意味着(递归地)复制数组的内容以及数组本身。没有快速简便的方法来创建数组的深层副本,因为它很大程度上取决于如何(如果?)对引用的对象进行深层副本。Bharat提出了一种方法(由于序列化和反序列化对象并要求它们遵守,因此成本很高NSCoding
),一种方法可能类似于:
_nsmarr = [NSArray withCapacity:[_nsarr count]];
for(MyObject* foo in _nsarr) {
[_nsmarr addObject:[foo copy]];
}
假设foo实现了该NSCopying
协议,那么这基本上与Milan建议的initWithArray:copyItems:方法相同:
_nsmarr = [[NSMutableArray alloc] initWithArray:_nsarr copyItems:YES];
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句