八十二、基础框架(四十)复制 物件-浅层复制 VS 深层复制
来源:互联网 发布:monaco windows 10 编辑:程序博客网 时间:2024/05/22 03:12
在下面的程序当中 我们 将 可修改字符串 添加到 数组物件当中 以便于 我们 可以修改 数组物件中的某个字符串。研究一下 下面的程序,看看 你 能不能理解 程序运行的结果:
这个程序 运行过后,可以得到 这样的结果:
我们 通过这行语句 将 数组物件dataArray中第0个物件 读取了出来:
然后 再 将 字符串@”ONE” 添加 到数组物件dataArray的第0个物件当中:
在程序的运行结果当中,你 会注意到 数组物件dataArray 和 它的复制品dataArray2中第一个物件的内容 都改变了。你 也许会理解 为什么数组物件dataArray中第0个物件的内容 会改变,但 不见得能理解 为什么数组物件dataArray的复制品dataArray2中第0个物件的内容 会发生 同样的改变。当你 从一个集合中 获得 一个物件时,你获得的 不是 这个物件的复制品,而是 这个物件的地址。所以 当我们 对dataArray这个物件 采取 objectAtIndex:这项措施 并将 0 作为参数时,我们获得的 是 数组dataArray中第0个物件的地址,而不是 第0个物件的复制品。而 变量mutableString、数组dataArray 和 dataArray2当中第0个元素 都是 同一个物件的地址,所以 改变 一个 就会改变 其余所有的。
既然 数组dataArray2 是 数组dataArray的复制品,而 改变 数组dataArray中第0个物件 就会改变 dataArray2中第0个元素 是 因为我们 对数组dataArray 只进行了 浅层复制。当我们 对数组物件dataArray 采取 mutableCopy这项措施时,新的内存空间 就会分配给 新的数组物件,同时 数组物件dataArray中每个物件的地址 都会复制到 新分配的内存空间内。这 就意味着 我们 只是把 数组物件dataArray中每个物件的地址 从旧的位置 复制 到新的位置,而不是 将 数组物件dataArray中每个物件本身 从旧的位置 复制 到新的位置。
如果 我们 要将 数组物件中每个物件本身 而不是 它们的地址 从旧的位置 复制 到新的位置,那么 我们 必须进行 深层复制。但是 基础框架提供的copy 和 mutableCopy这两项措施 并不能进行 深层复制。在之后 我们 可以了解到 基础框架的归档功能 可以进行 深层复制。
当你 对数组、辞典 或者 集合 进行复制时,你 不但 可能需要将 这些集合中各个成员的地址 从一个地方 复制 到另外一个地方,而且 需要将 这些集合中各个成员本身 从一个地方 复制 到另外一个地方。比如 你 想改变 数组dataArray2中第0个物件 而不想改变 数组dataArray1中第0个物件,那么 你 可以创建 一个新的数组 并且 将 其 存入 数组dataArray2中第0个位置,就像 这样:
即便 是 这样,变量mutableString 和 数组物件dataArray2第0个元素 依然 存储着 同一个物件的地址,所以 对mutableString做出的改变 也会影响 数组物件dataArray2中的第0个元素。
- 八十二、基础框架(四十)复制 物件-浅层复制 VS 深层复制
- 八十九、基础框架(四十七)归档-利用 归档器 复制 物件
- 八十、基础框架(三十八)复制 物件
- 八十三、基础框架(四十一)复制 物件-实施 协议
- c# 浅层复制与深层复制
- java-浅层复制和深层复制
- 深层复制与浅层复制
- 深层复制与浅层复制
- 八十四、基础框架(四十二)复制 物件-在n 和 setN:这两项措施当中 复制 物件
- 八十一、基础框架(三十九)复制 物件-copy 和 mutableCopy这两项措施
- 浅复制与深层复制
- C++中的浅层复制和深层复制
- java中的深层复制和浅层复制
- Java对象的浅层复制与深层复制
- 论clone深层复制和浅层复制
- JAVA浅层复制深层复制理解-java_01_20160824
- 七十、基础框架(二十八)文件操作-复制 文件 以及 NSProcessInfo这类物件的使用
- java对象深层复制和浅复制
- 列表的逆序和重排
- c语言枚举类型详解
- vs2010下载
- 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