user1994291
user1994291

Reputation:

Passing a simple NSMutableArray change original

I am having hard time with a simple array that i want to pass .

I have a class with some NSMutableArray that i pass to another class(the array is global from singleton)

 [mgzm saveWithArray:[Globals sharedGlobals].allImages];

To this function :

-(void)saveWithArray:(NSMutableArray*)currentArray
{

     dataToSave=[[NSMutableArray alloc] init]; //local
     dataToSave=[currentArray mutableCopy]; //copy

Than i saw that is is changing the original array which i don't want . So i did this :

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

Which result in a situation that i can't change the dataToSave array get get a crash when trying to.(it needs to be changed).

Than i did this :

for(NSMutableDictionary *dic in currentArray)
    [dataToSave addObject:dic];

Which again if i change dataToSave it change also the original array (?! )

Is there a way in this language to COPY array without changing the original one ????

Upvotes: 2

Views: 151

Answers (2)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726579

When you make a copy of a mutable array, changing the array copy does not change the original array, not the objects inside the array. Here is what happens when you call [currentArray mutableCopy]:

What you have

The two arrays are pointing to the same objects. If you remove an object from the copy, the original array would still have it. However, if you modify the object itself (say, change the name of A to X) the change will reflect on the object in the original array, because it is the same object.

Here is what you want to happen:

What you want

Now the two arrays are completely independent of each other. This is the effect that you achieve when you call

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

However, there is a catch: in order for this to work, the objects inside the array must conform to NSCopying protocol, otherwise the code is going to crash.

To fix this, make sure that the objects inside NSMutableArray implement NSCopying. Here is an answer that explains how it is done.

Upvotes: 2

Flexicoder
Flexicoder

Reputation: 8501

The problem is although you are creating a new array the NSDictionary objects within the new array are still the same ones. So you need to make copies of the NSDictionary objects, you we're close but you need to do something like this...

-(void)saveWithArray:(NSMutableArray*)currentArray
{

     dataToSave=[[NSMutableArray alloc] init]; //local
     for(NSMutableDictionary *dic in currentArray)
           [dataToSave addObject:[NSDictionary dictionaryWithDictionary:dic];
}

Upvotes: 0

Related Questions