博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
copy
阅读量:2396 次
发布时间:2019-05-10

本文共 2913 字,大约阅读时间需要 9 分钟。

转载自:http://www.tongwenguan.com/tag/copywithzone

如果  你  想对某个物件  采取  copy这项措施,而  这个物件  又属于  你自己创建的类型,比如  AddressBook这类物件,就像  这样:

你  就会得到  像这样的错误信息:

如果  你需要复制的物件  属于  你自己创建的类型,那么  你创建的这类物件  必须遵循  <NSCopying>这项协议,也就是  要实施  这项协议中规定的措施。

现在  我们  要示范  如何编写  一项叫作copy的措施,并且  使  这项措施  适用于  Fraction这类物件。如果  你创建的物件类型  包含  在基础框架中任何一类物件当中,那么  你  必须采取  更为复杂的策略。你  必须考虑到  这点:包含你这类物件的那一大类物件  可能采取了  自己的策略。

我们  回忆一下  每个Fraction这类物件  都包含了  变量numerator  和  denominator。要复制  Fraction类型的物件,我们  需要为  新的物件  分配  内存空间,初始化,最后  将  变量numerator  和  denominator的值  存储 到新的物件当中

如果  你的物件类型  遵循  <NSCopying>这项协议,那么  你  必须编写  copyWithZone:这项措施,并且  使  之 适用于  这类物件。因为  你  对一个物件  采取  copy这项措施后,copy这项措施  就会采取  copyWithZone:这项措施。如果  你  需要区分  可修改复制品  和  不可修改复制品,那么  你  可以使  你的物件  遵循  <NSMutableCopying>这项协议,并且  实施  mutableCopyWithZone:这项措施。copyWithZone:这项措施产生的结果  为  不可修改的复制品,而  mutableCopyWithZone:这项措施产生的结果  为  可修改的复制品。要创建  可修改的复制品  并不要求  被复制的物件  是  可修改的。

首先  要将  Fraction这类物件的接口文件中的@interface命令  修改成  这样:

然后  在实施文件中  加入  copyWithZone:这项措施的具体内容:

其中的参数zone  和  你在程序中分配、使用的不同内存区域  有关。只有  你编写的程序  需要分配  许多内存空间  而且  你  需要优化  内存分配时,你  才需要处理  zone这个参数。

下面的程序  检验了  copyWithZone:这项措施  是否  正常  工作:

运行  这个程序后,可以得到  这样的结果:

 

这个程序  首先  创建了  一个Fraction类型的物件fractionOne,并且  将  fractionOne的值  设定为  2/5。然后  对fractionOne这个物件  采取  copy这项措施,copy这项措施  会对fractionOne这个物件  采取  copyWithZone:这项措施。copyWithZone:这项措施  会创建  一个新的Fraction类型物件,并且  将  其实施对象中的值  复制  到新创建的Fraction类型物件当中,接着  将  新创建的Fraction类型物件的地址  传递回来,并且  存储  在变量FractionTwo当中。将  物件fractionOne  复制  到fractionTwo后,我  将  fractionTwo的值  显示出来,以便验证  复制  是否成功。

接着  把  fractionTwo的值  设定为  1/3后,再  将  fractionOne  和  fractionTwo的值  分别  显示出来,以便验证  变量fractionOne  和  fractionTwo  并没有存储着  同一个物件的地址。

如果  你的这类物件  还包含  另外一小类物件,那么  copyWithZone:这项措施  同样  适用于  这一小类物件。在这种情况下,你  需要把

这行语句  修改为

这样  你分配的内存空间  就属于  copyWithZone:这项措施的实施对象所属的类型了。

你可能感兴趣的文章
Struts2--非表单标签
查看>>
MyBatis--工作原理
查看>>
Maven--插件的获取和配置
查看>>
MySQL--基础四(排序查询)
查看>>
MySQL--基础五(单行函数)
查看>>
MySQL--基础六(分组函数)
查看>>
MySQL--基础七(分组查询、排序查询)
查看>>
MySQL--基础八(连接查询)
查看>>
MySQL--基础九(sql99连接查询)
查看>>
MySQL--基础十(子查询)
查看>>
Git--Eclipse操作、忽略文件、推送到远程库
查看>>
Oracle--同义词详解
查看>>
Oracle--存储过程概述、创建和执行
查看>>
Oracle--带参数的存储过程(IN、OUT和IN OUT)
查看>>
Oracle--触发器详解(分类、作用、执行顺序和语法)
查看>>
Oracle--DML触发器
查看>>
Oracle--替代触发器(INSTEAD OF)
查看>>
Oracle--系统事件触发器、用户事件触发器
查看>>
Oracle--管理触发器(查看、启用/禁用、修改、删除)
查看>>
Oracle--事务详解
查看>>