如果想自定义类支持拷贝操作,那就要实现NSCopying协议(而不是复写copy方法)或 NSMutableCopying的协议。

不可变版本的拷贝:

NSCopying协议,该协议只有一个方法:

-(id)copyWithZone:(NSZone*)zone;

// 以前开发程序时,会据此把内存分成不同的“区”(zone),而对象会创建在某个区里面。现在不用了,每个程序只有一个区:“默认区”(default zone)。

例:

-(id)copyWithZone:(NSZone*)zone {

  Person *copy = [[[self class]allocWithZone:zone]initWithFirstName:_firstName andLastName:_lastName]; // 这里使用了"全能初始化方法"

  // copy->_friends = [_friends mutableCopy]; // 类中的数据结构可能并未在初始化方法或“全能初始化方法”中设置好,需要另行设置。

  // 这里的_friends 是.m中使用的实例变量。

  // 或

  // copy->_friends = [NSMutableSet alloc]initWithSet:_friends copyItems:YES]; // 若copyItem为YES,则该方法会向数组中的每个元素发送copy消息。用拷贝好的元素创建新的set。

  // 这两种方式说明:遵从NSCopying协议的对象不一定采用了深拷贝的方式来实现的。

  return copy;

}

可变版本的拷贝:

NSMutableCopying的协议。也只定义了一个方法:

-(id)mutableCopyWithZone:(NSZone*)zone;

注意:

在可变对象上调用copy方法会返回另外一个不可变类的实例(mutableCopy反之)。这样做是为了能在可变版本与不可变版本之间自由切换。

不过也可能出现某个方法将一个NSMutableArray对象当作NSArray返回给你,而你在上面调用copy方法来复制它。由此以为拷贝后的对象是不可变的数组,但实际上它却是可变的(运行时特性),所以这就出问题了。

可以查询类型信息(参见第14条)以判断待拷贝的实例是否可变。

深拷贝(deep copy)和 浅拷贝(shallow copy)

深拷贝:在拷贝对象自身(指针)时,将其底层数据也一并复制过去。

浅拷贝:只拷贝对象自身(指针).

Foundation框架中的所有collection类在默认情况下都执行浅拷贝,

总结:

如果想自定义类支持拷贝操作,则需实现NSCopying协议。

如果自定义的对象分为可变版本和不可变版本,那么就要同时实现NSCopying与NSMuableCopying协议。

复制对象时需决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝。

如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法。

第22条:理解NSCopying协议的更多相关文章

  1. 设计模式之原型模式(深入理解OC中的NSCopying协议以及浅拷贝、深拷贝)

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节. 比如说,有一个Person类,有firstN ...

  2. 深入理解AMQP协议

    深入理解AMQP协议 2018年10月22日 12:32:16 一剑何风情 阅读数:1941   文章目录 一.AMQP 是什么 二.AMQP模型 工作过程 深入理解 三.Exchange交换机 默认 ...

  3. 转载和积累系列 - 深入理解HTTP协议

    深入理解HTTP协议 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

  4. APP界面设计之页面布局的22条基本原则

    移动 APP 页面布局(Layout)是我们设计 app 界面的时候,最主要的设计任务.一个 app 的好与不好,很大部分取决于移动 APP 页面布局的合理性. 下图为 APP 最原始的布局模型. 页 ...

  5. 爬虫入门系列(一):快速理解HTTP协议

    4月份给自己挖一个爬虫系列的坑,主要涉及HTTP 协议.正则表达式.爬虫框架 Scrapy.消息队列.数据库等内容. 爬虫的基本原理是模拟浏览器进行 HTTP 请求,理解 HTTP 协议是写爬虫的必备 ...

  6. 网络编程懒人入门(六):深入浅出,全面理解HTTP协议

    本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广 ...

  7. SaaS公司融资的「22条军规 」(转)

    编者按:本文是SaaS教父Jason Lemkin的一篇分享.他在文章中分享了他不投资一家公司的22条理由,希望对打算融资和正在融资的你有所启发. 为何有的早期创业公司能成功融资,而有的公司融资却屡遭 ...

  8. (转存 作者未知)深入理解HTML协议

    深入理解HTML协议 http协议学 习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(Worl ...

  9. 【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

    引言 原则1尽可能地使用属性而不是可直接访问的数据成员 原则2偏向于使用运行时常量而不是编译时常量 原则3 推荐使用is 或as操作符而不是强制类型转换 原则4 推荐使用条件属性而不是if条件编译 原 ...

随机推荐

  1. elecworks无法连接至协同服务器

    http://jingyan.baidu.com/article/597a0643759e1c312b524385.html 在安装路径中找到Server文件夹,在文件夹中你可以看到只有一个文件[Ew ...

  2. .NET设计模式(1):开篇

    转载:http://terrylee.cnblogs.com/archive/2005/12/09/293465.html .NET设计模式开篇 --.NET设计模式系列之一 Terrylee,200 ...

  3. vss2005使用

    http://www.cnblogs.com/nianyuwen/archive/2012/06/13/2547588.html 签出状态的文件别人无法使用:

  4. 高效使用Bitmaps(三) 神奇的Cache

    转载:http://my.oschina.net/rengwuxian/blog/184650 应用的场景 假设你开发了一个聊天程序,它的好友列表中显示从网络获取的好友头像.可是如果用户发现每次进入好 ...

  5. Stage3D学习笔记(六):旋转动画效果

    我们这节在上一篇代码的基础上再进一步,让显示的纹理进行旋转. 实现旋转,只需要每帧修改_modelViewMatrix的旋转角度即可,我们需要一个变量来记录旋转: //旋转度数 private var ...

  6. MySQL 约束

    MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息: 约束主要完成对数据的检验,保证数据库数据的完整性:如果有相互依赖数据 ...

  7. 如何在64位系统上安装SQL Server 2000

    如何在64位系统上安装SQL Server 2000? 现在用SQL Server 2000数据库的人少了吧?大都是SQL Server 2005/2008了.不过还是有需求的,今天一朋友就让我在他的 ...

  8. vs2005升级到vs2010相关问题

    1.项目编译失败,报 Resgen.exe 退出 ,错误代码2 处理方式: http://jingyan.baidu.com/article/90895e0fe80c6064ed6b0b6b.html ...

  9. MySQL内存表的特性与使用介绍

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. <转>linux 下stm32开发环境安装

    传送门: http://www.eefocus.com/marianna/blog/13-10/298454_7e04f.html http://blog.sina.com.cn/s/blog_643 ...