浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址
深拷贝是真正的复制了一份,复制的对象指向了新的地址。
从上图可以看出,浅拷贝A指针改变了所指向的内容B指针也指向被修改后的内容。如果有些地方用到B指针,不希望在A指向的内容发生变化时也跟着变化,则需要用到深拷贝。通俗理解为:浅拷贝好比你的影子,你死了,影子也没了;深拷贝好比克隆人,你死了,它还在。
深拷贝和浅拷贝的本质是地址是否相同
在开发过程中,大体上会区分为对象和容器两个概念,对象的copy是浅拷贝,mutablecopy是深拷贝。
容器包含对象的拷贝,无论是copy,还是mutablecopy都是浅拷贝,要想实现对象的深拷贝,必须自己提供拷贝方法。
1、非容器不可变对象:NSString
2、非容器可变对象: NSMutableString
3、容器类不可变对象: NSArray
4、容器类可变对象: NSMutableArray
代码测试
非容器不可变对象
结论:对于非容器不可变对象的copy为浅拷贝,mutableCopy为深拷贝浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象深拷贝返回新的内存地址,返回对象为可变对象非容器可变对象
结论:对于非容器可变对象的copy为深拷贝mutableCopy为深拷贝并且copy和mutableCopy返回对象都为可变对象容器不可变对象
结论:从上述输出中可以看出容器类不可变对象mutableCopy确实返回一个新的容器,但容器内的元素仍然是浅拷贝容器可变对象
总结:
通过上述代码分析:
copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
mutableCopy:始终是深拷贝
在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。
网友评论