Swift的Copy-on-Write技術

Copy-on-Write技術

Swift針對標準庫中的集合類型(Array、Dictionary、Set)進行優化。當變量指向的內存空間并沒有發生改變,進行拷貝時,只會進行淺拷貝。只有當值發生改變時才會進行深拷貝。

/**
*   讀取變量指向地址
*/
func address(of object: UnsafeRawPointer) -> String {
    let addr = Int(bitPattern: object)
    return String(format: "%p", addr)
}

var array1 = [1, 2, 3, 4, 5, 6]
var array2 = array1
print(address(of: &array1))
print(address(of: &array2))
// 結果:
// 0x100527f60
// 0x100527f60

array1和array2都是指向地址是同一個空間,所以可以看出當前是淺拷貝

func address(of object: UnsafeRawPointer) -> String {
    let addr = Int(bitPattern: object)
    return String(format: "%p", addr)
}

var array1 = [1, 2, 3, 4, 5, 6]
var array2 = array1
array2[0] = 2           // 值發生了改變
print(address(of: &array1))
print(address(of: &array2))
// 結果:
// 0x100593ec0
// 0x102800230

array1和array2指向了不同的空間,所以可以看出當前是淺拷貝

Copy-on-Write技術的實現

用set來進行講解

final class Ref<T> {
  var val: T
  init(_ v: T) {val = v}
}

struct Box<T> {
  var ref: Ref<T>
  init(_ x: T) {ref = Ref(x)}
  var value: T {
    get { return ref.val }  // 讀取操作
    set {           // 修改操作
      if (!isUniquelyReferencedNonObjC(&ref)) { // 判斷當前的類型值是否唯一的引用(即引用計算器為1)
        ref = Ref(newValue)     // 如果不是唯一的引用,則生成一個新的類型值并返回
        return
      }
      ref.val = newValue    // 如果是唯一的引用,則直接用當前的類型值進行修改
    }
  }
}

Array、Dictinary、Set每次進行修改前,都會通過類似isUniquelyReferencedNonObjC進行判斷,判斷是否是唯一的引用(即引用計數器為1)。若不為1,則創建新的類型值并返回。若是唯一的則直接賦值。

注意點

當Array、Dictionary、Set并沒有進行修改操作值,建議把變量設置為let

參考:
https://swift.gg/2018/12/06/friday-qa-2015-04-17-lets-build-swiftarray/
https://juejin.im/post/5cbd31225188250a6e7e5d35

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在Swift中,如果你具有較大的值類型對象或數據并且必須將其作為參數分配或傳遞給一個函數,則在性能方面復制它代價可...
    小涼介閱讀 8,699評論 2 30
  • 一、深復制和淺復制的區別? 1、淺復制:只是復制了指向對象的指針,即兩個指針指向同一塊內存單元!而不復制指向對象的...
    iOS_Alex閱讀 1,423評論 1 27
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,136評論 1 32
  • title: OC_Note date: 2014-10-21 21:16:49tags: OC-NOTESima...
    我的夢想伴隨笑容而堅強閱讀 459評論 0 1
  • 其實也不算深度解析啦,主要是題目要響亮一點大家才有看的欲望嘛!!! 首先關于Copy想必在面試題中大家見過很多,下...
    沒有黑眼圈de熊貓閱讀 1,161評論 2 2