美文网首页工作生活
关于数组的深复制浅复制

关于数组的深复制浅复制

作者: ZZ_军哥 | 来源:发表于2019-07-03 16:56 被阅读0次

数组使用copy和MutableCopy复制:

1.不可变数组+copy=浅复制

2.不可变数组+mutableCopy = 深复制

3.可变数组+copy = 深复制

4.可变数组+mutableCopy = 深复制

本文主要讲解的是关于数组里面存在对象的深复制.

关于容器类数组的深复制:

之前碰到这么一个状况,需要对数组进行复制一份,原始数组A复制出数组B,对B进行操作而不改变A的内容.然后不管用Copy和MutableCopy,里面的内容都是同一个地址.

举个例子:

Person类 Child类 玩具类 假数据 测试

我新建了三个类,Person类里面有child类数组,child类有玩具类数组.我新建了一个数组数据,利用YYModel已经将数据转化为对象存储在数组中,然后测试Copy和MutableCopy的效果.断点查看后,发现只对saveArr原数据将"雷爸爸"修改为"张艺谋"后,两个复制后的内容都进行了改变.

结果截图

然后查看官方说法,有两种方式进行内容的深复制,

一种是实现NSCopying,NSMtableCopy协议,并用 initWithArray:copyItems: 传YES的方式进行复制

另一种是实现NSCoding协议,利用归档的archivedDataWithRootObject复制出二进制数据,然后解档出一份新的数据,相当于是重新复制出一份,现在对两种方式进行测试.

A.copy协议:

- (id)copyWithZone:(NSZone*)zone{

    Person*per = [[[selfclass]allocWithZone:zone]init];

    per.personName = self.personName.copy;

    per.childrens = self.childrens.copy;

    returnper;

}

- (id)mutableCopyWithZone:(NSZone*)zone{

    Person*per = [[[selfclass]allocWithZone:zone]init];

    per.personName = self.personName.mutableCopy;

    per.childrens = self.childrens.mutableCopy;

    returnper;

}

- (id)copyWithZone:(NSZone*)zone{

    Child*child = [[[selfclass]allocWithZone:zone]init];

    child.childName = self.childName.copy;

    child.toys=self.toys.copy;

    returnchild;

}

- (id)mutableCopyWithZone:(NSZone*)zone{

    Child*child = [[[selfclass]allocWithZone:zone]init];

    child.childName = self.childName.mutableCopy;

    child.toys=self.toys.mutableCopy;

    returnchild;

}

- (id)copyWithZone:(NSZone*)zone{

    Toy*toy = [[[selfclass]allocWithZone:zone]init];

    toy.price=self.price;

    toy.toyName=self.toyName.copy;

    returntoy;

}

- (id)mutableCopyWithZone:(NSZone*)zone{

    Toy*toy = [[[selfclass]allocWithZone:zone]init];

    toy.price=self.price;

    toy.toyName=self.toyName.mutableCopy;

    returntoy;

}

实现NSCopying和NSMutableCopying协议后,我们测试一下

测试代码 结果 打印内容

结果显示:原始数组内容改变了,复制出来的内容没有改变,说明是深复制,但是看第二层,对原数据进行改变复制出来的内容也改变了,打断点也没有走Child的协议方法,说明NSCopy可以实现第一层的深复制,对于多层无能为力.

现在开始测试归档的方法

三个类Coding的实现(通用)

原始的值:

未改变之前的值

查看改变的数组的值.

可以看到原始数据已经改变 可以看到是完全的深复制

结论:

1.通过NSCopying/NSMutableCopying协议,initWithArray: copyItems:YES来进行复制,是不完全的复制,只能复制第一层,多层结构无能为力.

2.通过NSCoding协议,通过归档转二进制,再将二进制转对象的复制是玩玩全全的复制,但是里面的对象都需要实现NSCoding协议.

相关文章

  • javascript 数组以及对象的深拷贝

    数组的深拷贝在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示: for 循环实现数组的深...

  • 关于数组的深复制浅复制

    数组使用copy和MutableCopy复制: 1.不可变数组+copy=浅复制 2.不可变数组+mutableC...

  • 拷贝与内存管理

    一、关于深拷贝和浅拷贝的总结 理解 本质上我认为区别在于复制是是指针复制(浅拷贝)还是复制到新的地址上(深拷贝) ...

  • Javascript对象的深浅拷贝

    开门见山,有人叫对象的复制为深复制浅复制,也有人叫深拷贝浅拷贝。其实都是copy。 深拷贝(递归复制,复制所有层级...

  • 浅拷贝与深拷贝

    由于引用类型直接复制的效果是地址的复制,只是两个变量指向了同一块内存。 所以有了浅拷贝和深拷贝。 浅拷贝 数组的浅...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • 浅|深 复制

    浅复制 //只写main函数 //结果是 我们可以看到一旦pointArray1发生了改变pointArray2也...

  • OC属性常用关键字

    含义: copy 复制内容(深复制),如果调用copy的是数组,则为指针复制(浅复制),仅仅复制子元素的指针。 @...

  • 浅拷贝和深拷贝

    关于浅拷贝和深拷贝的介绍 浅拷贝 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。 ...

  • 浅析iOS的浅复制与深复制

    原文:浅析iOS的浅复制与深复制 最近同事问我一个问题:原数组A,进行复制得到数组B,改变数组B的Person元素...

网友评论

    本文标题:关于数组的深复制浅复制

    本文链接:https://www.haomeiwen.com/subject/annqhctx.html