八十三、基础框架(四十一)复制 物件-实施 协议
来源:互联网 发布: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:这项措施的实施对象所属的类型了。
- 八十三、基础框架(四十一)复制 物件-实施 协议
- 八十、基础框架(三十八)复制 物件
- 八十四、基础框架(四十二)复制 物件-在n 和 setN:这两项措施当中 复制 物件
- 八十二、基础框架(四十)复制 物件-浅层复制 VS 深层复制
- 八十一、基础框架(三十九)复制 物件-copy 和 mutableCopy这两项措施
- 八十九、基础框架(四十七)归档-利用 归档器 复制 物件
- 七十、基础框架(二十八)文件操作-复制 文件 以及 NSProcessInfo这类物件的使用
- 六十一、基础框架(十九)辞典物件-对 辞典物件 进行快速枚举
- 四十四、基础框架(二)数字物件
- 四十六、基础框架(四)字符串物件
- 五十一、基础框架(九)数组物件
- 六十、基础框架(十八)辞典物件
- 五十二、基础框架(十)数组物件-生成 质数表
- 六十三、基础框架(二十一)文件操作-NSFileManager这类物件
- 六十五、基础框架(二十三)文件操作-数据物件
- 七十一、基础框架(二十九)文件操作-文件操作柄,NSFileHandle这类物件
- 七十二、基础框架(三十)文件操作-文件操作柄,NSFileHandle这类物件2
- 七十五、基础框架(三十三)内存管理-引用计数 与 字符串物件
- Windows下安装使用OpenLDAP
- Oracle “CONNECT BY” 使用
- 八十二、基础框架(四十)复制 物件-浅层复制 VS 深层复制
- 失无所失的伤感空间日志分享:我会一直这样爱着你,心甘情愿
- 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
- 八十三、基础框架(四十一)复制 物件-实施 协议
- linux centos 端口开关
- hdu4450
- 未指定路径时,CreateProcess与ShellExecute(Ex) 查找路径之不同
- 八十四、基础框架(四十二)复制 物件-在n 和 setN:这两项措施当中 复制 物件
- oracle 的 CONNECT BY 和START WITH
- 2011软件水平考试嵌入式系统设计师辅导笔记(2)
- 书籍记录
- 应用防火墙能否击败DDoS攻击