iOS之拷贝

来源:互联网 发布:网络技术部工作流程 编辑:程序博客网 时间:2024/05/16 06:17

对象拷贝

  1. 浅拷贝和深拷贝

    1. 深浅拷贝便于理解的定义,如下:

      1. 浅拷贝:在拷贝操作时,对于被拷贝的对象的每一层拷贝都是指针拷贝。
      2. 深拷贝:在拷贝操作时,对于被拷贝的对象至少有一层拷贝是深拷贝。
      3. 完全拷贝:在拷贝操作时,对于被拷贝的对象的每一层拷贝都是对象拷贝。
注:
      1. 所谓的层次划分是指数组对象本身和数组内对象的层次。
      2. 在拷贝操作时,对于对象有n层时对象拷贝,我们可称作n级深拷贝,此处n应大于等于1.
      3. 对于完全拷贝目前通用办法是:迭代法和归档
      4. 指针拷贝俗称指针拷贝,对象拷贝也俗称内容拷贝。
      5. 一般来讲: 浅层拷贝:拷贝引用对象的指针;深层拷贝:拷贝引用对象内容。
想要实现对象拷贝,要向被拷贝的对象发送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了。

原创粉丝点击