深复制、浅复制

概念

  • 深复制:对目标对象内容单独拷贝一份出来,存放在一块新开辟的内存区域。当目标对象发生变化时对当前拷贝对象无影响。
  • 浅复制:只是拷贝了指向目标对象的指针,当目标对象发生变化时,当前拷贝对象也随之发生变化。

实验

单层复制

这里我们将NSString类型对象作为数据源,分别查看当对其复制时采用copy和mutableCopy有什么区别。

数据源不可变

代码:

 //目标对象
 NSString *initialStr = @"abc";
 //copy
 NSString *copyStr = [initialStr copy];
 //mutableCopy
 NSString *mutableCopyStr = [initialStr mutableCopy];

结果:
这里写图片描述

分析:
1、对不可变对象使用copy进行复制时,内容和地址一样。
2、对不可变对象使用mutableCopy进行复制时,内容一样,地址不同。
结论:
对不可变对象采用copy复制是浅复制,采用mutableCopy是深复制。

数据源可变

代码:

NSMutableString *initialMutableStr = [NSMutableString stringWithString:@"123"];
NSString *copyStr1 = [initialMutableStr copy];
NSString *mutableCopyStr1 = [initialMutableStr mutableCopy];

结果:
这里写图片描述
分析:
1、对可变对象copy后内容不变,地址变。
2、对可变对象mutableCopy后,内容不变,地址变。
结论:
对可变对象无论使用copy还是mutableCopy都是深复制。

综合上面可以总结得到:

itemcopymutableCopy
不可变对象
可变对象
非单层复制

过程和面单层复制类似,下面是得到的结果描述:
1、不可变数组包含不可变数据
对数组进行copy操作,数组地址不变,包含元素的地址不变。进行mutableCopy操作,数组地址变,包含元素的地址不变。
2、不可变数组包含可变数据
对数组进行copy操作,数组地址不变,包含元素的地址不变。进行mutableCopy操作,数组地址变,包含元素的地址不变。
3、可变数组包含不可变数据
对数组进行copy操作,数组地址变,包含元素的地址保持不变。进行mutableCopy操作,数组地址变,包含元素的地址不变。
4、可变数组包含可变数据
对数组进行copy操作,数组地址变,包含元素的地址保持不变。进行mutableCopy操作,数组地址变,包含元素的地址不变。

综上得到:对集合类对象进行copy操作或者mutableCopy操作时,仅仅是第一层满足上文得到的表格规则,其他层依旧是浅复制,当源数据发生变化时,不管数组是浅复制还是深复制其内容依旧会发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值