Copy

浅拷贝和深拷贝

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:始终是深拷贝,引用计数器不改变。始终返回一个不可变对象。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值