Swift懶加載Tips

一、swift懶加載的原理:

lazy var 本質(zhì)上是聲明并執(zhí)行的閉包,或一個有返回值的函數(shù)調(diào)用,只執(zhí)行一次,使用的時候一定不為空。

lazy屬性必須是變量(var修飾符),因為常量屬性(let修飾符)必須在初始化之前就有值,所以常量屬性不能定義為lazy。

分配獨立的內(nèi)存空間,值一旦產(chǎn)生就不會再被改變:不會重走懶加載創(chuàng)建代碼,所以懶加載控件不能賦值為nil.

注:懶加載只會在第一次調(diào)用時執(zhí)行創(chuàng)建對象,后面如果對象被釋放了,則不會再次創(chuàng)建。而oc中會再次創(chuàng)建

寫法一:

lazy  var  myheaderview = LYBMyHeaderview.init(frame:CGRect.init(x: 10, y: 100, width: 300, height: 300))

寫法二:

 lazy var myheaderview:LYBMyHeaderview={undefined
        return LYBMyHeaderview.init(frame:CGRect.init(x: 0, y:CGFloat(TopSpaceHigh), width:WIDTH, height: 300.0))
   }()

寫法三:

lazy var myheaderview = {()->LYBMyHeaderview in
        return LYBMyHeaderview.init(frame:CGRect.init(x: 0, y:CGFloat(TopSpaceHigh), width:WIDTH, height: 300.0))
  }()

二、懶加載的定義

1、懶加載的本質(zhì)就是閉包
lazy var person : Human = {undefined

    print("懶加載的定義")

    return Human()

}()
2、懶加載改寫為閉包形式

let personFunc = { () -> Human in

    print("懶加載 --> 閉包")

    return Human()

}

lazy var personDemo : Human = self.personFunc()
3、懶加載的簡單寫法

lazy var person2 : Human = Human()

如果不需要做什么額外工作的話,可以直接賦值:

lazy var str: String = "Hello"

1)、對象的懶加載

lazy  var tab:UITableView = {undefined

    var tabv=UITableView.init(frame:CGRect(x:0,y:0,width:WIDTH,height:HEIGHT-64-49), style: UITableViewStyle.plain)

    if HEIGHT==812{undefined

       tabv=UITableView.init(frame:CGRect(x:0,y:0,width:WIDTH,height:HEIGHT-88-34-49), style: UITableViewStyle.plain)

    }

    return tabv

}()

2)、數(shù)組懶加載

lazy  var titArr:[String]={undefined

  let  titAr=["我的紅包","新手教程","我的家族","我的交易","我的銀行卡","實名認證","常見問題","關(guān)于我們"]

    return titAr

}()

在高階函數(shù)(map flatMap)之前加上 lazy,這些類型其實就是保留了一個對“原序列”的引用,又保留了一個對“待調(diào)用閉包”的引用,然后只在某個元素被訪問時再對這個元素調(diào)用該閉包,做出實際的計算。
弊端:計算出的返回值并沒有被緩存(memoization),再次調(diào)用,再次進入閉包走流程。

Swift 標準庫中,SequenceType 和 CollectionType 協(xié)議都有個叫 lazy 的計算屬性,它能給我們返回一個特殊的 LazySequence 或者 LazyCollection。這些類型只能被用在 map,flatMap,filter這樣的高階函數(shù)中,而且是以一種惰性的方式。

隱式 lazy
在 class 中使用 static let 是 Swift 創(chuàng)建單例的最佳實踐,原因在于 static let 是惰性的、線程安全的,而且只能被創(chuàng)建一次。

被聲明在全局作用域下、或者被聲明為一個類型屬性(聲明為static let、而非聲明為實例屬性)的常量是自動具有惰性(lazy)的(還是線程安全的)。

————————————————
版權(quán)聲明:本文為CSDN博主「liyubao160」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u011146511/article/details/79245676

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容