fuzzygoat
fuzzygoat

Reputation: 26223

mutableCopyWithZone, copy NSMutableArray?

I a trying to make a mutableCopy of a planet object that contains 5 instance variables (one of them being an NSMutableArray of string literals. My problem is that I am unsure how to set the newPlanet>data to a copy of self>data, does that make sense?

-(id) mutableCopyWithZone: (NSZone *) zone {
    Planet *newPlanet = [[Planet allocWithZone:zone] init];
    NSLog(@"_mutableCopy: %@", [newPlanet self]);
    [newPlanet setName:name];
    [newPlanet setType:type];
    [newPlanet setMass:mass];
    [newPlanet setIndex:index];

    // NSMutableArray *data; HOW TO: newPlanet>data = self>data? 

    return(newPlanet);
}

EDIT_001:

Based on the comments by Chuck & bbum I updated my method and added the following ...

@property(retain) NSMutableArray *data;
@synthesize data;

.

-(id) mutableCopyWithZone: (NSZone *) zone {
    Planet *newPlanet = [[Planet allocWithZone:zone] init];
    NSLog(@"_mutableCopy: %@", [newPlanet self]);
    [newPlanet setName:name];
    [newPlanet setType:type];
    [newPlanet setMass:mass];
    [newPlanet setIndex:index];

    NSMutableArray *copiedArray = [[self data] mutableCopyWithZone:zone];
    [newPlanet setData: copiedArray];
    [copiedArray release];

    return(newPlanet);
}

much appreciated

gary

Upvotes: 3

Views: 2188

Answers (3)

Chuck
Chuck

Reputation: 237060

Nothing too special here. Something like this:

NSMutableArray *copiedData = [[self data] mutableCopyWithZone:zone];
newPlanet.data = copiedData;
[copiedData release];

Upvotes: 6

Ciarán Walsh
Ciarán Walsh

Reputation: 1866

You probably want

newPlanet->data = [data mutableCopyWithZone:zone];

Be aware that if you use a setter (such as dot-access, or setData:), then you will be triggering another retain, so you should handle that appropriately.

Upvotes: 2

Asher Dunn
Asher Dunn

Reputation: 2394

Did you try something like [newPlanet setData:[[self data] mutableCopyWithZone:zone]]; ?

Upvotes: 0

Related Questions