浅拷贝:
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
深拷贝:
【Copy/MutableCopy】深拷贝是指拷贝的具体对象的内容,而内存地址是自助分配的,拷贝结束之后,两个对象虽然存在的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
非容器不可变对象:
//非容器不可变对象
NSString*str= @"teststr";
//1
NSString*strCopy= [str copy];
//2
NSMutableString *strMCoppy= [str mutableCopy];
//1[strMCoppy appendString:@"oo"];
//no errorNSLog(@"str-p= %p",str);
//0x100001030
NSLog(@"strCopy-p= %p",strCopy);
//0x100001030
NSLog(@"strMCopy-p= %p",strMCoppy);
//0x100506a20
copy复制的是指针,mutableCopy生成新的内存地址,并且返回的对象为可变对象
非容器可变对象:
//非容器可变对象
NSMutableString *mStr= [NSMutableString stringWithFormat:@"testStr"];
NSString*strCopy= [mStr copy];
NSMutableString *mStrCopy= [mStr copy];
NSMutableString *mStrMCopy= [mStr mutableCopy];
[mStrCopyappendString:@"0"];
//error
[mStrMCopy appendString:@"0"];
//no errorNSLog(@"mStr-p= %p",mStr);
//0x1001065d0
NSLog(@"strCopy-p= %p",strCopy);
//0x7274537473657475
NSLog(@"mStrCopy-p= %p",mStrCopy);
//0x7274537473657475
NSLog(@"mStrMCopy-p = %p",mStrMCopy);
//0x1001067f0
1.copy对可变对象非容器类为深拷贝。(对象地址为何是同一个???)
2.mutableCopy对可变非容器类为深拷贝。
3.copy产生的对象返回的为不可变。
容器类非可变对象
//容器类不可变对象
NSArray *array1= [NSArray arrayWithObjects:@"a",@"b",@"c", nil];
NSArray *arrCopy1= [array1 copy];
//指针复制
NSMutableArray *mArrCopy1 = [array1 mutableCopy];
//对象复制(里面的元素为指针复制)NSLog(@"array-p= %p",array1);
//0x1002043c0
NSLog(@"arrCopy-p= %p",arrCopy1);
//0x1002043c0
NSLog(@"mArrCopy-p= %p",mArrCopy1);
//0x100203900NSArray *array2= [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c", nil];
NSArray *arrCopy2= [array2 copy];
//指针复制
NSMutableArray *mArrCopy2 = [array2 mutableCopy];
//对象复制(里面的元素为指针复制)NSLog(@"array-p= %p",array2);
//0x100105c50
NSLog(@"arrCopy-p= %p",arrCopy2);
//0x100105c50
NSLog(@"mArrCopy-p= %p",mArrCopy2);
//0x100106f60
//由此可见,对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。
//http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Articles/Copying.htmlNSArray *deepCopyArray=[[NSArray alloc] initWithArray: array2 copyItems: YES];
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject: array2]];
NSLog(@"deepCopyArray-p= %p",deepCopyArray);
//第一个元素对象复制,其他指针复制
NSLog(@"trueDeepCopyArray-p= %p",trueDeepCopyArray);
//容器内元素全部对象复制
结论: 1.copy:对于可变对象为深复制;对于不可变对象是浅复制,引用计数每次加一,始终返回不可变的对象。(?)
2.mutableCopy:始终是深复制,始终返回一个可变对象。
3.对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Articles/Copying.html