概念
- 深复制:对目标对象内容单独拷贝一份出来,存放在一块新开辟的内存区域。当目标对象发生变化时对当前拷贝对象无影响。
- 浅复制:只是拷贝了指向目标对象的指针,当目标对象发生变化时,当前拷贝对象也随之发生变化。
实验
单层复制
这里我们将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操作时,仅仅是第一层满足上文得到的表格规则,其他层依旧是浅复制,当源数据发生变化时,不管数组是浅复制还是深复制其内容依旧会发生变化。