写时复制:
var x = [1,2,3]
var y = x
如果我们创建了一个新的变量y,并且把x赋值给它,会发生复制,现在x和y含有的是独立的结构体。
在内部,这些Array结构体含有指向某个内存的引用。这个内存就是数组中元素的存储位置,它们位于
堆上。在这个时候,两个数组的引用指向的是内存中同一个位置,这两个数组共享了它们的存储部分。不过,
当我们改变x的时候,这个共享会被检测到,内存将会被复制。这样一来,我们得以独立地改变两个变量。昂贵的元素复制
操作只在必要的时候发生,也就是我们改变这两个变量的时候发生复制。如果Array结构体中的引用在数组被改变的一瞬间是
唯一的话(比如没有声明y),那么也不会有复制发生,内存的改变将在原地进行。这种行为就是写时复制。
当使用结构体时,如果自己的类型内部含有一个或多个可变引用的话,要想保持值语义,并且避免不必要的复制时,需要自己实现写时复制。
struct MyData {
var _length:Int
var _data:NSMutableData
init(_ data:NSData,length:Int) {
self._data = data.mutableCopy() as! NSMutableData
self._length = length
}
}
let theData = NSData(base64Encoded: "wAEP/w==")
let x = MyData(theData!,length:theData!.length)
let y = x
当把x赋值给y的时候,里面进行的是浅复制,这意
味着_data这个对象本身不会被复制,而只是对象_data的引用被复制了。
复制之后,y._data和x._data指向了同一块内存空间,
当修改x._data被修改时,y._data也发生了变化
网友评论