对象拷贝
- 浅拷贝和深拷贝
- 深浅拷贝便于理解的定义,如下:
- 深浅拷贝便于理解的定义,如下:
- 浅拷贝:在拷贝操作时,对于被拷贝的对象的每一层拷贝都是指针拷贝。
- 深拷贝:在拷贝操作时,对于被拷贝的对象至少有一层拷贝是深拷贝。
- 完全拷贝:在拷贝操作时,对于被拷贝的对象的每一层拷贝都是对象拷贝。
注:
- 所谓的层次划分是指数组对象本身和数组内对象的层次。
- 在拷贝操作时,对于对象有n层时对象拷贝,我们可称作n级深拷贝,此处n应大于等于1.
- 对于完全拷贝目前通用办法是:迭代法和归档
- 指针拷贝俗称指针拷贝,对象拷贝也俗称内容拷贝。
- 一般来讲: 浅层拷贝:拷贝引用对象的指针;深层拷贝:拷贝引用对象内容。
想要实现对象拷贝,要向被拷贝的对象发送retain、copy、mutableCopy消息。2.结论
retain:始终是浅拷贝。引用计数每次加1。返回对象是否可变与被拷贝的对象保持一致。copy:对于可变对象为深拷贝,引用计数不改变;对于不可变对象是浅拷贝,引用计数每次加1。始终返回一个不可变对象。mutableCopy:始终是深拷贝,引用计数不改变。始终返回一个可变对象。
3.使用场景
深拷贝是在要将一个对象从可变(不可变)转为不可变(可变)或者将一个对象内容克隆一份时用到。浅拷贝是在要拷贝一个对象的指针时用到。
2.在程序中实现对象拷贝
OC中并不是所有的类都支持拷贝,只有遵循NSCopying协议的类,才支持copy拷贝;只有遵循NSMutableCopying协议的类,才支持mutableCopy拷贝。如果没有遵循上述两种协议的类,运用拷贝会发出异常。如果是自定义的类,那么我们需要注销NSCopying、NSMutableCopying协议,然后重写 - (id)copyWithZone:(NSZone *)zone 和 - (id)mutableCopyWithZone:(NSZone *)zone这两个方法,这样就能调用copy和mutableCopy了。