- 问题概述
- 原理分析
- 实现代码
- 参考文章
1、问题概述
在iOS中遵从NSCopying与NSMutableCopying协议并实现了copyWithZone与mutableCopyWithZone的官方类或自定义类都可以通过copy或者mutableCopy方法,实现复制,但会根据被复制的对象与上下文环境保护的需要来执行深复制还是浅复制。
深复制:在堆中,重新开辟与被复制对象大小一致的内存空间,并将被复制对象完整的拷贝过来。
浅复制:新创建的指针指向被复制对象。
1、原理分析
(1)对于非容器对象
iOS中,复制的根本目标是为了上下文保护。防止数据之间的耦合度高互相修改,容易产生无法预料的后果。
copy方法返回的对象的不可变对象,而mutableCopy方法返回的对象是可变对象。
immutable obj +copy =被复制对象与复制对象都是不可变的,因此浅复制即可。
immutable obj +mutableCopy = 因为返回对象是mutable,为了防止复制对象的数据修改对被复制对象的影响,采用深复制。
mutable obj + copy = 防止被复制对象的修改对复制对象的影响,因此采用深复制,但返回对象是immutable
mutable obj + mutableCopy = 防止互相影响,采用深复制。
(2)对于容器对象
对于容器对象,其top-level是完全符合以上准则的,但对于其他level层,也就是对象中的子对象,无论是copy还mutablecopy,mutable或immutable都是浅复制。
总结:只有immutable + copy 才是浅复制,其他情况都是深复制。
(3)实现完全深拷贝
a、通过对子对象也进行mutable方法来实现
b、通过对对象归档解档来实现
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
3、实现代码
略;
4、参考文章