工作生活

关于数组的深复制浅复制

2019-07-03  本文已影响0人  ZZ_军哥

数组使用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协议.

上一篇 下一篇

猜你喜欢

热点阅读