Swift类和结构体学习02写时复制

写时复制: 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 = https://www.it610.com/article/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也发生了变化

    推荐阅读