如果想自定义类支持拷贝操作,那就要实现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. hdu 5586 Sum【dp最大子段和】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5586 Sum Time Limit: 2000/1000 MS (Java/Others)    Me ...

  2. jquery.layout框架分割线

    css <link href="${base}/res/common/css/jquery.layout/jquery.layout.css" rel="style ...

  3. 智能电视TV开发---客户端和服务器通信

    在做智能电视应用的时候,最头疼的就是焦点问题,特别是对于个人开发者,没有设备这是最最头疼的事情了,在没有设备的情况下,怎么实现智能电视应用呢,接下来我是用TV程序来做演示的,所以接下来的所有操作是在有 ...

  4. Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点

    Oracle 中利用闪回查询确定某表在某时间点之后的修改内容: 1.查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMEST ...

  5. server2008服务器iis设置的一些经验

    安装顺序会有一定得影响,如果是先安装IIS,再安装.NET Framework,系统应该可以正常解析.aspx页面:但是,如果是先安装了.NET Framework,再安装IIS,则会由于相关的IIS ...

  6. spring利用javamail,quartz定时发送邮件 <转>

    原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...

  7. Spring3 MVC Login Interceptor(Spring 拦截器)

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

  8. MFC 学习之 鼠标移动到Toolbar按钮上显示提示信息(tooltip),状态栏也随之改变

    1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1 2.在主程序的.h文件中加入变量:           CToolBar m_toolbar;CImageList ...

  9. ios项目不能再用UDID了

    今天更新项目时,出现 Apps are note permitted to access the UDID and must not use the uniqueIdentifier method o ...

  10. file_put_contents() failed to open stream: Permission denied 问题解决

    很长时间没有写PHP了,今天突然有个需求要写一个保存文件的功能. function downloadFile( $url , $savePath = '' ) {     $fileName = ge ...