iOS 关于数组深拷贝 initWithArray:copyItems: 方法的讨论
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 关于数组深拷贝 initWithArray:copyItems: 方法的讨论相关的知识,希望对你有一定的参考价值。
参考技术A 包含有对象类型的数组。无论可变还是不可变,通过copy,mutableCopy都不能将数组内的model完全copy一份,虽然得到的数组是新的,但数组中model的指针指向的还是之前的model。此时,如果改变了数组中model的值,原数组会受到影响。如果对象是单层的(没有嵌套的模型),此时,model遵循NSCopying,NSMutableCopying协议,实现copyWithZone和mutableCopyWithZone方法。
Array通过 initWithArray:copyItems: 方法可以得到一个完全拷贝过的数组(数组内的model也是全新的model)。
如果数组内的model有嵌套,例如
可以看出,改动B数组中的firstObject,A中的name没有跟着改变,但A中的gender发生了变化。
接下来再试一下,gender类也遵循NSCopying,NSMutableCopying协议。看下是什么效果。
如上图所示,依然不能满足要求。
此时。需要你在copyWithZone方法中,new一个新的Gender对象(newGender),将person的gender各个属性的值,手动赋值给这个newGender。再将newGender赋值给person。
其实,person遵循NSCopying协议,系统会帮你去调用copyWithZone,但是copyWithZon具体的实现,还是你自己决定的。就相当于自己手动new了一个新对象,然后赋值,最后把这个新对象return出来。 跟你自己在工具类中,写一个model间数据转化的方法是一个道理。
将A数组序列化为一个Data,再将Data解归档为一个新的数组。此时的数组就是一个全新的数组。
person和gender类都需要遵循NSCoding协议,实现initWithCoder 和 encodeWithCoder方法。
再试一次, bingo!
以上是关于iOS 关于数组深拷贝 initWithArray:copyItems: 方法的讨论的主要内容,如果未能解决你的问题,请参考以下文章