第22条:理解NSCopying协议

如果想自定义类支持拷贝操作,那就要实现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协议。

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

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

时间: 2024-10-22 08:31:36

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

《Effective Objective-C 2.0》—(第23-28条)—类别、协议,代理,匿名对象、delegate

第23条:通过委托与数据源协议进行对象间通信 对象之间经常需要相互通信,而通信方式有很多.OC开发者广泛使用一种名叫"委托模式"(Delegate Pattern)的编程设计模式来实现对象间的通信,该模式的主旨是:定义一套接口,某对象若想接收另一个对象的委托,则需遵从此接口,以便称为"委托对象"(delegate).而这"另一个对象"则可以给其委托对象回传一些信息,也可以在发生相关联时间时通知委托对象. 此模式可以将数据与业务逻辑解耦. 在Obj

【报文】理解HTTP协议的Request/Response(请求响应)模型

[报文]理解HTTP协议的Request/Response(请求响应)模型 系列目录 [简介]"请求/响应"模型 http://www.cnblogs.com/engraver-lxw/p/7550514.html [原理]理解HTTP协议的Request/Response(请求响应)模型 http://www.cnblogs.com/engraver-lxw/p/7550691.html [报文]理解HTTP协议的Request/Response(请求响应)模型--当前 http:/

22条创业军规,让你5分钟读完《创业维艰》

导语:“硅谷最牛的50个天使投资人”之一——本·霍洛维茨:“在担任CEO的8年多时间里,只有3天是顺境,剩下的8年几乎全是举步维艰.” 本·霍洛维茨,硅谷资深创业者,“硅谷最牛的50个天使投资人”之一. 1999年他与网景之父马克·安德森共同创立Loudcloud公司,后转型为Opsware公司,在互联网泡沫的恶劣大环境下,数次带领公司起死回生,并最终成功以16亿美元的高价将公司出售给惠普. 多年以后他用这样一句话总结他的创业时光:“在担任CEO的8年多时间里,只有3天是顺境,剩下的8年几乎全是

深入理解HTTP协议、HTTP协议原理分析

深入理解HTTP协议.HTTP协议原理分析 目录(?)[+] http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本.其中最著名的就是RFC 26

深入理解HTTP协议(转)原出处已不明

http协议学习系列---我从这里转来的http://www.blogjava.net/zjusuyong/articles/304788.html 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC

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

深入理解HTTP协议 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本.其中最著名的就是RFC 2616.RFC 2616定义了今天普遍使用的一个版本——HTTP

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

本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53869998 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 引言 我们知道,在C++领域,作为进阶阅读材料,必看的书是<Effective C++>. 而<Effective C#>之于C# ,是类似<Effective C++>之于C++一样的存在. 这篇文章,

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

4月份给自己挖一个爬虫系列的坑,主要涉及HTTP 协议.正则表达式.爬虫框架 Scrapy.消息队列.数据库等内容. 爬虫的基本原理是模拟浏览器进行 HTTP 请求,理解 HTTP 协议是写爬虫的必备基础,招聘网站的爬虫岗位也赫然写着熟练掌握HTTP协议规范,写爬虫还不得不先从HTTP协议开始讲起 HTTP协议是什么? 你浏览的每一个网页都是基于 HTTP 协议呈现的,HTTP 协议是互联网应用中,客户端(浏览器)与服务器之间进行数据通信的一种协议.协议中规定了客户端应该按照什么格式给服务器发送

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

深入理解HTML协议 http协议学 习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系 列的RFC,RFC 1945定义了HTTP/1.0版本.其中最著名的就是RFC 2616.RFC 2616定义了今天普遍