美文网首页
Swift类和结构体学习02写时复制

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

作者: 流星大石头 | 来源:发表于2017-01-04 10:15 被阅读11次
    写时复制: 
    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也发生了变化
    

    相关文章

      网友评论

          本文标题:Swift类和结构体学习02写时复制

          本文链接:https://www.haomeiwen.com/subject/fsdovttx.html