iOS深拷贝和浅拷贝
2019-05-28 本文已影响0人
爱好技术的小白
浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址
深拷贝是真正的复制了一份,复制的对象指向了新的地址。

深拷贝和浅拷贝的本质是地址是否相同
在开发过程中,大体上会区分为对象和容器两个概念,对象的copy是浅拷贝,mutablecopy是深拷贝。
容器包含对象的拷贝,无论是copy,还是mutablecopy都是浅拷贝,要想实现对象的深拷贝,必须自己提供拷贝方法。
1、非容器不可变对象:NSString
2、非容器可变对象: NSMutableString
3、容器类不可变对象: NSArray
4、容器类可变对象: NSMutableArray
代码测试
非容器不可变对象

非容器可变对象

容器不可变对象


容器可变对象


总结:
通过上述代码分析:
copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
mutableCopy:始终是深拷贝
在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。