我很难用一个我想传递的简单数组。
我有一个带有一些NSMutableArray的类,我将它传递给另一个类(该数组是从singleton中的全局数据)
[mgzm saveWithArray:[Globals sharedGlobals].allImages];
到这个功能:
-(void)saveWithArray:(NSMutableArray*)currentArray
{
dataToSave=[[NSMutableArray alloc] init]; //local
dataToSave=[currentArray mutableCopy]; //copy
比我看到的那样正在改变我不想要的原始阵列。 所以我这样做了:
dataToSave=[[NSMutableArray alloc] initWithArray:currentArray copyItems:YES];
导致我无法更改dataToSave
数组的情况会在尝试时崩溃。(需要更改)。
比我这样做:
for(NSMutableDictionary *dic in currentArray)
[dataToSave addObject:dic];
如果我改变dataToSave
,它也会改变原始数组(?!)
用这种语言有没有办法让COPY数组不改变原来的????
答案 0 :(得分:2)
制作可变数组的副本时,更改数组副本不会更改原始数组,也不会更改数组中的对象。以下是您致电[currentArray mutableCopy]
时发生的事情:
两个数组指向相同的对象。如果从副本中删除对象,原始数组仍将具有该对象。但是,如果您修改对象本身(例如,将A
的名称更改为X
),则更改将反映原始数组中的对象,因为它是同一个对象。
以下是您想要发生的事情:
现在两个阵列完全相互独立。这是您在致电时实现的效果
dataToSave=[[NSMutableArray alloc] initWithArray:currentArray copyItems:YES];
但是,有一个问题:为了使其正常工作,数组中的对象必须符合NSCopying
协议,否则代码将崩溃。
要解决此问题,请确保NSMutableArray
中的对象实现NSCopying
。 Here is an answer that explains how it is done
答案 1 :(得分:0)
问题是虽然您正在创建一个新数组,但新数组中的NSDictionary
个对象仍然是相同的。所以你需要制作NSDictionary
个对象的副本,你我们很接近你需要做这样的事情......
-(void)saveWithArray:(NSMutableArray*)currentArray
{
dataToSave=[[NSMutableArray alloc] init]; //local
for(NSMutableDictionary *dic in currentArray)
[dataToSave addObject:[NSDictionary dictionaryWithDictionary:dic];
}