深复制、浅复制

时间:2022-08-23 14:35:43

概念

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

实验

单层复制

这里我们将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都是深复制。

综合上面可以总结得到:

item copy mutableCopy
不可变对象
可变对象

非单层复制

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

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