本文仅作记录和学习
1. 问题的引入
原来做项目,参数作为对象被另外一个控制器引用,一般都不会对其修改,或者可以修改需要同之前的controller联动,所以之前对于对象的深浅拷贝没有比较深的思考,但最近一段时间做项目,需要一定的联动性,不过是需要保存后才可以进行联动,为保证两控制器中的数据独立,对数据进行深拷贝显得很必要
之前对于深浅拷贝的理解只限于这么几个字浅拷贝是拷贝指针,深拷贝是拷贝内容
,但是深拷贝我们需要做些什么,他的实现机制如何,什么样的操作属于浅拷贝,什么属于深拷贝,这些问题都值得思考和实践。
下面这张图只是简单说明了下深浅拷贝的区别
2. 深浅拷贝的含义
- 浅拷贝
在进行浅拷贝时,会想原始的对象发送retain操作,引用计数加一,同时将原数据的指针拷贝给新的变量。 - 深拷贝
深拷贝在我看来可以分成两种,一种是单层深拷贝(不是真的深拷贝,只是拷贝最外边的一层,即one-level-deep copy),另一种是真正的深拷贝。
实现深拷贝的方式:- 使用系统的方法,即
initWithArray:copyItems:
使用这类的方法,但是这样的方法需要其中的其中的元素都要遵循NSCopying
协议,如果使用这类的方法,其中对象不遵从该协议,会在运行时报错。 - 二是使用归档 ,通过归档和解档实现对数据内存的分割,如
- 使用系统的方法,即
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
另外一个会涉及到深浅拷贝的
- 非集合类对象的copy与mutableCopy
在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;
对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制
- 集合类对象的copy与mutableCopy
在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制;对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制