八十三、基础框架(四十一)复制 物件-实施 协议

来源:互联网 发布:monaco windows 10 编辑:程序博客网 时间:2024/05/22 02:05

如果  你  想对某个物件  采取  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:这项措施的实施对象所属的类型了。


原创粉丝点击