一、OC设计copy的目的

  为了能够从源对象copy一个新的对象副本,改变新对象(副本)的时候,不会影响到原来的对象。

二、实现copy协议

  OC提供了两种copy方法:copy和mutableCopy,一个对象要想使用copy方法必须实现NSCoppying协议,想使用mutabCopy必须实现NSMutableCopying协议。

三、copy的作用

【ObjectC—浅copy和深copy】-LMLPHP

从上面这个图我们可以看出,其实创建可变或不可变对象跟源对象没有关系,而跟复制的方式有关系。以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方法。

05-11 16:26