解开对copy、mutableCopy,深复制和浅复制的疑惑

一、深拷贝,浅拷贝

对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;
深复制是除了拷贝指向对象的指针,而且直接拷贝整个对象内存到另一块内存中。
再简单些说:浅复制就是指针拷贝;深复制就是内容拷贝。
浅copy: 指针复制,不会创建一个新的对象。深copy: 内容复制,会创建一个新的对象。

二、非集合类的对象 shallow copy 和 deep copy

在非集合类对象中:
对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;
对mutable对象进行copy和mutableCopy都是内容复制。
用代码简单表示如下:
[immutableObject copy] // 浅复制 + 不可变对象
[immutableObject mutableCopy] //深复制 + 可变对象
[mutableObject copy] //深复制 + 不可变对象
[mutableObject mutableCopy] //深复制 + 可变对象

三、集合类的对象自身的 shallow copy 和 deep copy

在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制;
对mutable对象进行copy和mutableCopy都是内容复制。
但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:
[immutableObject copy] // 浅复制 + 不可变对象[immutableObject mutableCopy] //单层深复制 + 可变对象[mutableObject copy] //单层深复制 + 不可变对象[mutableObject mutableCopy] //单层深复制 + 可变对象

四、集合类的对象中元素的 one-level-deep copy 、two-level-deep copy 和 real-deep copy

1、集合类的对象中的元素为 Foundation 架构下的

1)单层深复制
对(集合类) 对象自身执行深copy,对 (集合类)对象内部的元素 执行浅copy,称为集合类的单层深复制。
2)双层深copy
这里的双层指的NSArray对象一层 和 NSArray容器内对象 的一层
3)完全深复制 (完美copy)
如果想 完美的解决NSArray嵌套NSArray这种情形,使用归档、解档的方式

2、集合类的对象中的元素为 Custom对象

1)单层深复制  (demo:OC_Copy3_1)
对比之前的 NSString,我们需要遵守NSCopying, NSMutableCopying,才可以进行copy和mutableCopy 操作集合类对象自身执行了深copy,集合类对象中的元素执行浅copy
2)双层深copy  (demo:OC_Copy3_2,OC_Copy3_3)
这里的双层指的NSArray对象一层 和 NSArray容器内对象 的一层
3)完全深复制 (完美copy)  (demo:OC_Copy3_4)
如果想 完美的解决NSArray嵌套NSArray这种情形,使用归档、解档的方式
对于自定义的类,需要遵循NSCoding协议
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容