一、OC设计copy的目的
为了能够从源对象copy一个新的对象副本,改变新对象(副本)的时候,不会影响到原来的对象。
二、实现copy协议
OC提供了两种copy方法:copy和mutableCopy,一个对象要想使用copy方法必须实现NSCoppying协议,想使用mutabCopy必须实现NSMutableCopying协议。
三、copy的作用
从上面这个图我们可以看出,其实创建可变或不可变对象跟源对象没有关系,而跟复制的方式有关系。以NSString为例分情况说明下:
1)NSString调用copy方法
是浅拷贝,出于对性能的考虑,只是对源对象计数器+1(相当于retain),并没有产生新的对象。
2)NSMutableString调用copy方法
是深拷贝,产生一个不可变的副本,源对象的计数器不变,新产生对象的计数器为1。
3)NSString调用MutableCopy方法
是深copy,产生一个可变的副本,源对象的计数器不变,新产生对象的计数器为1。
4)NSMutableString调用MutableCopy方法
是深copy
由此可见,除了NSstring的copy方法是浅copy,其他三种情况都是深copy。
总结来说:
1)深copy:也就是内容copy,会从源对象复制一份新的对象出来,新对象计数器为1,源对象的计数器不发生变化。
2)浅copy:也就是指针copy,只是将指针复制一份给对象,源对象计数器会+1,通常相当于对象retain操作。
四、自定义对象实现copy
分两步走:
1)实现copyying(mutableCopying)协议。
2)实现copyWithZone方法。