一、深拷贝,浅拷贝
对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;
深复制是除了拷贝指向对象的指针,而且直接拷贝整个对象内存到另一块内存中。
再简单些说:浅复制就是指针拷贝;深复制就是内容拷贝。
浅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协议