OC浅拷贝和深拷贝
浅拷贝:拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址。
深拷贝 :真正的复制了一份,复制的对象指向了新的地址。
从上图可以看出,浅拷贝A指针改变了所指向的内容B指针也指向被修改后的内容。如果有些地方用到B指针,不希望在A指向的内容发生变化时也跟着变化,则需要用到深拷贝。
通俗理解为:浅拷贝好比你的影子,你死了,影子也没了;深拷贝好比克隆人,你死了,它还在。
深拷贝和浅拷贝的本质是地址是否相同
在开发过程中,大体上会区分为对象和容器两个概念,
对象的copy是浅拷贝,mutablecopy是深拷贝。
容器包含对象的拷贝,无论是copy,还是mutablecopy都是浅拷贝,要想实现对象的深拷贝,必须自己提供拷贝方法。
1、非容器不可变对象:NSString
2、非容器可变对象: NSMutableString
3、容器类不可变对象: NSArray
4、容器类可变对象: NSMutableArray
demo验证
非容器不可变对象
结论:
1、对于非容器不可变对象的copy为浅拷贝,mutableCopy为深拷贝
2、浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象
3、深拷贝返回新的内存地址,返回对象为可变对象
非容器可变对象
结论:
1、对于非容器可变对象的copy为深拷贝
2、mutableCopy为深拷贝
3、并且copy和mutableCopy返回对象都为可变对象
容器不可变对象
结论:
对不可数组进行copy,拷贝后的数组以及数组内内容和原来的一致;
对不可变数组进行mutableCopy,会形成一个新的数组,但是数组里的成员和原先数组的地址一致。
容器可变对象
结论:对于可变数组进行copy和mutableCopy都会生成一个新的数组,但是数组里面的内容地址还是没变,和之前的数组里的内容地址一致。
自定义类对象的深浅拷贝
在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。
实现容器对象的完全拷贝
自定义person类需要实现NScoding 协议,否则在使用NSKeyedArchiver的时候会Crash