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 <NSCopying> Protocol
你必须实现copyWithZone:方法来应对拷贝行为,如果你想实现mutable和immutable拷贝行为,你还要实现NSMutableCopying协议中的mutableCopyWithZone:方法。
前者应该返回一个immutable拷贝后者应该返回一个mutable拷贝。
它的用法如下:


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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 不敢说覆盖OC中所有copy的知识点,但最起码是目前最全的最新的一篇关于 copy的技术文档了。后续发现有新...
    zyydeveloper阅读 3,435评论 4 35
  • 作为一个20年教龄的乡村教师,本来我还是挺安于自己工作,幸福感满满的。每天和学生打交道,单纯快乐。工资不高,但是不...
    香杉阅读 331评论 0 0
  • 其实画了衣服就想弃坑,惨不忍睹。可是一想,本来就是画小丑,难看就难看吧~捂嘴笑…… 成品图 上一张与原图的对比图 线稿
    水漾七七阅读 562评论 6 3
  • 其实·有很多话 一谈便·滔滔不绝· 不断的在思考·在质疑· 为什么? 自己决定的·扛在自己的肩上的· 许多的有心无...
    one_two12阅读 145评论 0 2
  • 文/达佚 从出租车上下来张兵直接钻进这幢房子临街的楼道里。 门口写着,二楼红楼梦宾馆,三楼私人按摩,四楼北斗星辅导...
    达佚阅读 666评论 0 4