Chapter 18 Copying Objects

The copy and mutableCopy Methods
它们可以创建一份某个对象的拷贝,这是通过实现NSCopying协议做到的。
如果你想针对mutable和immutable对象分别进行拷贝,你就必须还要实现NSMutableCopying协议,如下图所示:


你也可以删除指定下标的元素,如下图所示:

拷贝的mutable和immutable属性与源的mutable和immutable属性无关。
Shallow Versus Deep Copying
浅度复制还是只复制引用而已,如果你想做到改变拷贝而不改变原值就必须深度复制。
深度复制并不是默认情况下的复制行为,所以说无论你使用copy还是mutableCopy那都不是深度复制。
如果你想做深度复制,你就必须创建一个字符串,然后对这个新的字符串进行修改,修改完后再用它去替换你原先想要修改的字符串。
但是此时这个新创建的字符串与这个目标字符串仍然是同一个,你改一个就等于改俩。
Implementing the Protocol
你必须实现copyWithZone:方法来应对拷贝行为,如果你想实现mutable和immutable拷贝行为,你还要实现NSMutableCopying协议中的mutableCopyWithZone:方法。
前者应该返回一个immutable拷贝后者应该返回一个mutable拷贝。
它的用法如下:


上图中这个NSZone *是个很有用的类型,它可以通过把大量零散的空间组织在一起来达到空间优化的目的。你可以把它作为参数传入copyWithZone:然后交给allocWithZone:处理。
如果父类实现了allocWithZone:方法,子类自然就继承了,那么子类的写法就变成如下这样子。

如果父类早就已经实现了allocWithZone,那么你需要在你的copy方法中把父类以上层次中的成分统统复制一遍。
Copying Objects in Setter and Getter Methods
在setter方法中也存在复制的问题,也存在你改变参数的时候同时改变了属性的问题,于是你可以这样写:
Chapter 18 Copying Objects_第1张图片

如果属性中没有加nonatomic修饰而是atomic,你的实例就必须加mutex锁,虽然这会降低程序执行效率,但是为了线程安全这是必须的。
对于属性来说没有mutableCopy限制,所以只能用copy加以限制,所以这导致了immutable拷贝的生成。
相同的问题也会出现在getter中,即,你get的结果不要影响原属性的值。当然如果属性本身就是immutable的,你可以直接返回引用。

你可能感兴趣的:(Chapter 18 Copying Objects)