美文网首页
深拷贝浅拷贝都是浅拷贝

深拷贝浅拷贝都是浅拷贝

作者: 3a169b0787bc | 来源:发表于2016-12-02 20:46 被阅读22次

直接上结论

    [immutableObject copy]   不可变
    [immutableObject mutableCopy] 可变
    [mutableObject copy] //不可变
    [mutableObject mutableCopy] //可变

    [immutableArray copy] // 浅复制
    [immutableArray mutableCopy] //单层深复制
    [mutableArray copy] //单层深复制
    [mutableArray mutableCopy] //单层深复制

对象类型不必说,复制之后都是新对象,指向不同的的地址。
解释一下这里声明的浅复制,单层深复制
浅复制 : 创建的新容器还是指向之前的地址,但是容器里面的元素还是指向相同的地址。

所有就copy与mutableCopy而言是无法完全实现拷贝一个全新的对象的。这个时候就轮到它出场了。

- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;

官方文档是这样的定义的。

    //If YES, each object in array receives a copyWithZone: message to create a copy of the object—objects must conform to the NSCopying protocol. In a managed memory environment, this is instead of the retain message the object would otherwise receive. The object copy is then added to the returned array.
    //If NO, then in a managed memory environment each object in array simply receives a retain message when it is added to the returned array.

也就是当YES的时候,容器里的每个对象都会收到copyWithZone的消息转发。
所以这也要求,里面的元素都遵守并实现了NSCopying的协议方法,然后实现
- (id)copyWithZone:(NSZone *)zone
- (id)mutableCopyWithZone:(nullable NSZone *)zone
当然系统的容器类都实现了,所以当自己创建的对象时,记得要实现这一方法,一般MJModel或者YYModel都实现了这个协议的。
用了它之后,就会发现这个时候复制又会深入一层。同时容器类执行相应的copyWithZone方法,immutableArray与mutableArray的实际执行又不一样。但是最终都无法直接实现多层容器的深复制。

这个时候又有两个方法可以操作一番了。
1.暴力解归档,这个最直接也是最方便的了。
2.对容器的元素也逐级复制。应该是swizzle一下mutableCopy,然后针对集合里面的元素也深复制就好了。

附上Demo地址,自己跑一遍,结果一目了然。

iOS 集合的深复制与浅复制
iOS中的copy,mutableCopy,深拷贝和浅拷贝
copy和mutableCopy都是浅拷贝!!!
IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
复制对象(一)copy和mutableCopy方法
从@property (nonatomic, copy) NSString *name;这个细思极恐的代码规范说起

相关文章

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • Python中浅拷贝和深拷贝的区别总结与理解

    单层浅拷贝 单层深拷贝 结论一: 不管深拷贝还是浅拷贝对不可变数据类型都是引用内存地址 不管深拷贝还是浅拷贝对可变...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • 深拷贝浅拷贝

    1.拷贝可变对象 深拷贝后浅拷贝可变对象,都是内存复制。 输出结果: 2.拷贝不可变对象 浅拷贝是指针拷贝,深拷贝...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • 2019-10-27

    深拷贝和浅拷贝 浅拷贝 切片[:]操作 和copy()函数相同,都是浅拷贝。示例:copy()函数说明:c拷贝一个...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • 深拷贝浅拷贝都是浅拷贝

    直接上结论 对象类型不必说,复制之后都是新对象,指向不同的的地址。解释一下这里声明的浅复制,单层深复制浅复制 : ...

网友评论

      本文标题:深拷贝浅拷贝都是浅拷贝

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