#import "DeepCopy.h" @implementation NSDictionary (DeepMutableCopy) - (id)deepMutableCopy { NSMutableDictionary* rv = [[NSMutableDictionary alloc] initWithCapacity:[self count]]; NSArray* keys = [self allKeys]; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; for (id k in keys) { [rv setObject:[[[self valueForKey:k] deepMutableCopy] autorelease] forKey:k]; } [pool release]; return rv; } @end @implementation NSArray (DeepMutableCopy) - (id)deepMutableCopy { int n = [self count]; NSMutableArray* rv = [[NSMutableArray alloc] initWithCapacity:n]; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; for (int i = 0; i < n; i++) { [rv insertObject:[[[self objectAtIndex:i] deepMutableCopy] autorelease] atIndex:i]; } [pool release]; return rv; } @end @implementation NSString (DeepMutableCopy) - (id)deepMutableCopy { return [self mutableCopy]; } @end @implementation NSDate (DeepMutableCopy) - (id)deepMutableCopy { return [self copy]; } @end @implementation NSData (DeepMutableCopy) - (id)deepMutableCopy { return [self mutableCopy]; } @end @implementation NSNumber (DeepMutableCopy) - (id)deepMutableCopy { return [self copy]; } @end @implementation NSNull (DeepMutableCopy) - (id)deepMutableCopy { return self; } @end