美文网首页
关于deepCopy 和shallowCopy

关于deepCopy 和shallowCopy

作者: Kk太阳 | 来源:发表于2017-03-03 21:21 被阅读54次

    本文仅作记录和学习

    1. 问题的引入

    原来做项目,参数作为对象被另外一个控制器引用,一般都不会对其修改,或者可以修改需要同之前的controller联动,所以之前对于对象的深浅拷贝没有比较深的思考,但最近一段时间做项目,需要一定的联动性,不过是需要保存后才可以进行联动,为保证两控制器中的数据独立,对数据进行深拷贝显得很必要

    之前对于深浅拷贝的理解只限于这么几个字浅拷贝是拷贝指针,深拷贝是拷贝内容 ,但是深拷贝我们需要做些什么,他的实现机制如何,什么样的操作属于浅拷贝,什么属于深拷贝,这些问题都值得思考和实践。

    下面这张图只是简单说明了下深浅拷贝的区别


    2. 深浅拷贝的含义
    • 浅拷贝
      在进行浅拷贝时,会想原始的对象发送retain操作,引用计数加一,同时将原数据的指针拷贝给新的变量。
    • 深拷贝
      深拷贝在我看来可以分成两种,一种是单层深拷贝(不是真的深拷贝,只是拷贝最外边的一层,即one-level-deep copy),另一种是真正的深拷贝。
      实现深拷贝的方式:
      • 使用系统的方法,即initWithArray:copyItems:使用这类的方法,但是这样的方法需要其中的其中的元素都要遵循NSCopying协议,如果使用这类的方法,其中对象不遵从该协议,会在运行时报错。
      • 二是使用归档 ,通过归档和解档实现对数据内存的分割,如
    NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
    [NSKeyedArchiver archivedDataWithRootObject:oldArray]];
    
    另外一个会涉及到深浅拷贝的
    1. 非集合类对象的copy与mutableCopy
    在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;
    对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:
    [immutableObject copy] // 浅复制
    [immutableObject mutableCopy] //深复制
    [mutableObject copy] //深复制
    [mutableObject mutableCopy] //深复制
    
    1. 集合类对象的copy与mutableCopy
    在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制;对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:
    [immutableObject copy] // 浅复制
    [immutableObject mutableCopy] //单层深复制
    [mutableObject copy] //单层深复制
    [mutableObject mutableCopy] //单层深复制
    

    相关文章

      网友评论

          本文标题:关于deepCopy 和shallowCopy

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