本文共 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:这项措施的实施对象所属的类型了。