iOS深拷贝和浅拷贝

2019-05-28  本文已影响0人  爱好技术的小白

浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址

深拷贝是真正的复制了一份,复制的对象指向了新的地址。

从上图可以看出,浅拷贝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。

上一篇下一篇

猜你喜欢

热点阅读