copy 与 mutableCopy

普通对象的拷贝

  • copy的目的是在修改原始版本和副本的时候,彼此各不干扰

  • copy拷贝为不可变对象

  • mutableCopy拷贝为可变对象

源对象 方式 操作 类型
不可变 copy 引用计数+1 浅拷贝,指针拷贝
mutableCopy 新建副本 深拷贝,对象拷贝
可变 copy
mutableCopy
  • @property (nonatomic, copy) NSString *str;

  • 给copy属性设置数值时,默认会做一次copy操作,拷贝出不可变的版本

    • 目标值是可变的,会建立一个不可变的副本

    • 目标值是不可变的,只是引用计数+1,于strong等效

  • 在OC中,对象真正的类型是实例化对象的时候,所采用的类型决定的

自定义对象的拷贝

  • 在很多第三方框架或者大型的应用程序中,会给自定义对象提供copy方法,方便快速建立类似的副本

  • 自定义对象要支持copy方法,需要做两件事

    • 遵守<NSCopying>协议

    • 实现copyWithZone方法

Zone

  • 空间,在非常底层才会使用,给对象分配内存空间的时候,是在堆中的

  • Zone是如果程序员希望堆中的分配空间相对连续,或者集中才会使用

  • 目的是为了减少对中的内存碎片,一般程序开发不需要,也完全没有必要关心

  • copy方法,最终会调用到copyWithZone方法