2022swift 面试大全

OC浅拷贝和深拷贝

2021-02-02  本文已影响0人  星空WU

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

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

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

上一篇下一篇

猜你喜欢

热点阅读