On 3 May 2008, at 4:00 pm, Hrishikesh Muruk wrote:


If I make an NSArray in the following manner:

NSArray *newArray = [NSArray arrayWithArray:oldArray];
[newArray retain];

Now I it is my responsobolity to send a release message to newArray. But am I responsible to send release messages to the contents of newArray?

No, they are retained by the array, and are released when the array is released.

How do I do a deep copy? If oldArray is an NSArray holding pointers of type MyObj*. If I want a newArray that duplicates the contents of oldArray. By that I mean I want the pointers in newArray to point to new objects of type MyObj rather than the same objects as oldArray how do I do this?

Would this work:

for(i=0;i<[oldArray count]; i++) {

  MyObj *temp = [[oldArray objectAtIndex:i] copy];
  [newArray addObject:temp];
}

But this requires MyObj to support the copy message. Do all objects in cocoa automatically support copy message (if they inherit from NSObject)?

No they don't - you have to implement copy if you claim to support the NSCopying protocol for your own objects - but most Cocoa objects themselves do implement it.

Is there an easier way to do deep copy of arrays?


You can use a category - I use the following, which allows you to do something like arrayCopy = [oldArray deepCopy]; However it's not magic - it just loops through and copies each object just as you do above - the advantage is that it deals with nested arrays and dictionaries. The disadvantage is that it *always* does this, for every object, which might be a blunt instrument in some cases. In general, you want to avoid the need to deep copy things.

(note deepCopy is implemented to follow copy semantics - caller is to release the returned object).


@implementation NSDictionary (DeepCopy)


- (NSDictionary*)               deepCopy
{
        NSMutableDictionary*    copy;
        NSEnumerator*                   iter = [self keyEnumerator];
        id                                              key, cobj;
        
        copy = [[NSMutableDictionary alloc] init];
        
        while(( key = [iter nextObject]))
        {
                cobj = [[self objectForKey:key] deepCopy];
                [copy setObject:cobj forKey:key];
                [cobj release];
        }

        return copy;
}


@end


#pragma mark -
@implementation NSArray (DeepCopy)

- (NSArray*)                    deepCopy
{
        NSMutableArray*                 copy;
        NSEnumerator*                   iter = [self objectEnumerator];
        id                                              obj, cobj;
        
        copy = [[NSMutableArray alloc] init];
        
        while(( obj = [iter nextObject]))
        {
                cobj = [obj deepCopy];
                [copy addObject:cobj];
                [cobj release];
        }

        return copy;
}


@end


#pragma mark -
@implementation NSObject (DeepCopy)

- (id)                                  deepCopy
{
        return [self copy];
}


@end

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to