浅拷贝和深拷贝
1.浅层拷贝:拷贝引用对象的指针(指针拷贝俗称指针拷贝)
2.深层拷贝:拷贝引用对象内容(对象拷贝也俗称内容拷贝)
引用网上大牛的描述:浅复制好比你和你的影子,你完蛋你的影子也完蛋;深复制好比你和你的克隆人,你完蛋你的克隆人还活着。
/* 非容器类不可变对象拷贝 */
NSString *str1 = @"kaobei";
NSLog(@"初始引用计数器为%lu",str1.retainCount);
NSString *strCopy1 = [str1 retain];
NSLog(@"retain 后引用计数器为%lu",str1.retainCount);
NSString *strCopy2 = [str1 copy];
NSLog(@"copy 后引用计数器为%lu",str1.retainCount);
NSString *strCopy3 = [str1 mutableCopy];
NSLog(@"mutableCopy 后引用计数器为%lu",str1.retainCount);
NSLog(@"str1地址%p",str1);
NSLog(@"retain拷贝地址%p",strCopy1);
NSLog(@"copy拷贝地址%p",strCopy2);
NSLog(@"mutableCopy拷贝地址%p",strCopy3);
2013-12-07 21:23:35.597深拷贝和浅拷贝[10652:303]初始引用计数器为18446744073709551615
2013-12-07 21:23:35.617深拷贝和浅拷贝[10652:303] retain后引用计数器为18446744073709551615
2013-12-07 21:23:35.618深拷贝和浅拷贝[10652:303] copy后引用计数器为18446744073709551615
2013-12-07 21:23:35.618深拷贝和浅拷贝[10652:303] mutableCopy后引用计数器为18446744073709551615
2013-12-07 21:23:35.619深拷贝和浅拷贝[10652:303] str1地址0x100001060
2013-12-07 21:23:35.619深拷贝和浅拷贝[10652:303] retain拷贝地址0x100001060
2013-12-07 21:23:35.620深拷贝和浅拷贝[10652:303] copy拷贝地址0x100001060
2013-12-07 21:23:35.620深拷贝和浅拷贝[10652:303] mutableCopy拷贝地址0x105a003f0
/* 容器类不可变对象拷贝 */
NSArray *array1 = [NSArrayarrayWithObjects:@"a",@"b",@"c",@"d",nil];
NSLog(@"初始引用计数器为%lu",array1.retainCount);
NSArray *arrayCopy1 = [array1 retain];
NSLog(@"retain 后引用计数器为%lu",array1.retainCount);
NSArray *arrayCopy2 = [array1 copy];
NSLog(@"copy 后引用计数器为%lu",array1.retainCount);
NSArray *arrayCopy3 = [array1 mutableCopy];
NSLog(@"mutableCopy 后引用计数器为%lu",array1.retainCount);
NSLog(@"array1地址%p",array1);
NSLog(@"retain拷贝地址%p",arrayCopy1);
NSLog(@"copy拷贝地址%p",arrayCopy2);
NSLog(@"mutableCopy拷贝地址%p",arrayCopy3);
2013-12-07 21:18:15.158深拷贝和浅拷贝[10578:303]初始引用计数器为1
2013-12-07 21:18:15.161深拷贝和浅拷贝[10578:303] retain后引用计数器为2
2013-12-07 21:18:15.161深拷贝和浅拷贝[10578:303] copy后引用计数器为3
2013-12-07 21:18:15.162深拷贝和浅拷贝[10578:303] mutableCopy后引用计数器为3
2013-12-07 21:18:15.162深拷贝和浅拷贝[10578:303] array1地址0x1027184b0
2013-12-07 21:18:15.163深拷贝和浅拷贝[10578:303] retain拷贝地址0x1027184b0
2013-12-07 21:18:15.163深拷贝和浅拷贝[10578:303] copy拷贝地址0x1027184b0
2013-12-07 21:18:15.163深拷贝和浅拷贝[10578:303] mutableCopy拷贝地址0x105801350
/* 非容器类可变对象拷贝 */
NSMutableString *str2 = [NSMutableStringstringWithString:@"kao bei"];
NSLog(@"初始引用计数器为%lu",str2.retainCount);
NSMutableString *strCopy1 = [str2 retain];
NSLog(@"retain 后引用计数器为%lu",str2.retainCount);
NSMutableString *strCopy2 = [str2 copy];
NSLog(@"copy 后引用计数器为%lu",str2.retainCount);
NSMutableString *strCopy3 = [str2 mutableCopy];
NSLog(@"mutableCopy 后引用计数器为%lu",str2.retainCount);
NSLog(@"str2地址%p",str2);
NSLog(@"retain拷贝地址%p",strCopy1);
NSLog(@"copy拷贝地址%p",strCopy2);
NSLog(@"mutableCopy拷贝地址%p",strCopy3);
2013-12-07 21:27:28.500深拷贝和浅拷贝[10695:303]初始引用计数器为1
2013-12-07 21:27:28.516深拷贝和浅拷贝[10695:303] retain后引用计数器为2
2013-12-07 21:27:28.518深拷贝和浅拷贝[10695:303] copy后引用计数器为2
2013-12-07 21:27:28.518深拷贝和浅拷贝[10695:303] mutableCopy后引用计数器为2
2013-12-07 21:27:28.519深拷贝和浅拷贝[10695:303] str2地址0x102718bc0
2013-12-07 21:27:28.519深拷贝和浅拷贝[10695:303] retain拷贝地址0x102718bc0
2013-12-07 21:27:28.520深拷贝和浅拷贝[10695:303] copy拷贝地址0x1044008a0
2013-12-07 21:27:28.520深拷贝和浅拷贝[10695:303] mutableCopy拷贝地址0x104400710
/* 容器类可变对象拷贝 */
NSMutableArray *array2 = [NSMutableArrayarrayWithObjects:@"a",@"b",@"c",@"d",nil];
NSLog(@"初始引用计数器为%lu",array2.retainCount);
NSMutableArray *arrayCopy1 = [array2retain];
NSLog(@"retain 后引用计数器为%lu",array2.retainCount);
NSMutableArray *arrayCopy2 = [array2copy];
NSLog(@"copy 后引用计数器为%lu",array2.retainCount);
NSMutableArray *arrayCopy3 = [array2mutableCopy];
NSLog(@"mutableCopy 后引用计数器为%lu",array2.retainCount);
NSLog(@"array2地址%p",array2);
NSLog(@"retain拷贝地址%p",arrayCopy1);
NSLog(@"copy拷贝地址%p",arrayCopy2);
NSLog(@"mutableCopy拷贝地址%p",arrayCopy3);
2013-12-07 21:30:04.751深拷贝和浅拷贝[10736:303]初始引用计数器为1
2013-12-07 21:30:04.768深拷贝和浅拷贝[10736:303] retain后引用计数器为2
2013-12-07 21:30:04.768深拷贝和浅拷贝[10736:303] copy后引用计数器为2
2013-12-07 21:30:04.769深拷贝和浅拷贝[10736:303] mutableCopy后引用计数器为2
2013-12-07 21:30:04.769深拷贝和浅拷贝[10736:303] array2地址0x102718670
2013-12-07 21:30:04.769深拷贝和浅拷贝[10736:303] retain拷贝地址0x102718670
2013-12-07 21:30:04.770深拷贝和浅拷贝[10736:303] copy拷贝地址0x105803340
2013-12-07 21:30:04.770深拷贝和浅拷贝[10736:303] mutableCopy拷贝地址0x102718710
总结:
retain:始终是浅拷贝。引用计时器加1。返回对象是否可变与被拷贝的对象保持一致。
copy:对于可变对象为深拷贝,引用计数不变;对于不可变对象是浅拷贝,引用计数每次加1,始终返回一个不可变对象。
mutableCopy:始终是深拷贝,引用计数器不改变。始终返回一个不可变对象。