传递一个简单的NSMutableArray更改原始

时间:2014-05-31 09:57:15

标签: objective-c

我很难用一个我想传递的简单数组。

我有一个带有一些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数组不改变原来的????

2 个答案:

答案 0 :(得分:2)

制作可变数组的副本时,更改数组副本不会更改原始数组,也不会更改数组中的对象。以下是您致电[currentArray mutableCopy]时发生的事情:

What you have

两个数组指向相同的对象。如果从副本中删除对象,原始数组仍将具有该对象。但是,如果您修改对象本身(例如,将A的名称更改为X),则更改将反映原始数组中的对象,因为它是同一个对象。

以下是您想要发生的事情:

What you want

现在两个阵列完全相互独立。这是您在致电时实现的效果

dataToSave=[[NSMutableArray alloc] initWithArray:currentArray copyItems:YES];

但是,有一个问题:为了使其正常工作,数组中的对象必须符合NSCopying协议,否则代码将崩溃。

要解决此问题,请确保NSMutableArray中的对象实现NSCopyingHere 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];
}