深、浅拷贝

复习一下深、浅拷贝

什么是深、浅拷贝(deep、shallow copy)

对于值类型应该不存在这两个概念,每次传递都是完全复制的,或者说一直都是深拷贝

对于引用类型来说

浅拷贝:拷贝的仅为对象的指针,没有产生新的对象(仅引用计数+1)

深拷贝:开辟新的内存区,复制出一个完全独立的对象

OC中的copy、mutableCopy方法

位于Foundation中的NSObject.h中有NSCopying、NSMutableCopying协议,实现相应的方法,即可调用相应的copy、mutableCopy方法

NSCopying协议:复制出不可变的副本

NSMutableCopying协议:复制出可变的副本

OC为什么区分可变与不可变类型呢?

历史原因,待补充

不可变类型:即对象创建完成之后就不能再改变其状态(成员变量只能在创建对象时传入,不提供设置成员变量的方法,只提供读取访问器)

Foundation框架中的已实现的方式

弄清楚概念,这两个协议和深浅拷贝是完全两个概念

思考一个问题,如果一个对象原本就是不可变类型,如NSArray,让你去实现NSCopying协议的方法,你会怎么写?再读一遍,是复制出一份不可变的副本。一般的做法应该都是直接返回self,不然难道会再新建一个不可变的对象副本吗?原对象都是不可变的了,难道还怕你修改它的副本,然后影响到原对象?

如何将数组中或其他容器中多层次的数据弄一份深拷贝呢?

暂时只知道归解档可以实现 也见到有遍历容器的类别,作为常用的工具类

  • +

js中的深、浅拷贝

  • js中通过JSON.parse(JSON.stringfy(x))进行深拷贝

java中的深、浅拷贝

实现Serializable接口,序列化/反序列化可以实现深拷贝,不需要序列化的属性需要transient申明


引用源

Written on October 13, 2020