Swift-写时复制(Copy-On-Write)

2,612 阅读1分钟

前言

  1. 在OC语言中,想要获取多个完全一致、互不干扰的对象,可以使用mutableCopy。
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@10, @8, @55, nil];
NSMutableArray *array1 = [arr mutableCopy];
  1. 在Swift中,值类型并没有copy相关的方法。但是提供了写时复制(Copy-On-Write)的特性。
let array1 = [1, 2, 3, 4]
var array2 = array1
// 断点1
array2.append(2) 
// 断点2
  • 断点1位置,使用 lldb 命令 fr v -R [object] 来查看对象内存结构。打印出 array1,array2 内存结构如下,我们可以看到 array1 和 array2 内存地址都是 0x0000600001e4c400,说明 array1 和 array2 此时是共享同一个实例。

  • 断点2位置,此时 array2 添加了新元素,打印 array2,内存结构如下,我们可以看到 array2 内存地址已经变成了0x0000000101a1a5d0,说明此时它们不再共享同一个实例,array2 对应的值进行了拷贝

结论

写时复制允许共享同一个内存地址,直到其中之一发生改变。这样的设计使得值类型可以被多次复制而无需耗费多余的内存,只有在变化的时候才会增加开销。因此内存的使用更加高效。

该特性只对Swift中的值类型有效(struct,enum,Int,Double,Float,String,Array,Dictionary,Set),当然你也可以在自定义类型中手动实现。