一、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=["我的紅包","新手教程","我的家族","我的交易","我的銀行卡","實名認(rèn)證","常見問題","關(guān)于我們"]
return titAr
}()
在高階函數(shù)(map flatMap)之前加上 lazy,這些類型其實就是保留了一個對“原序列”的引用,又保留了一個對“待調(diào)用閉包”的引用,然后只在某個元素被訪問時再對這個元素調(diào)用該閉包,做出實際的計算。
弊端:計算出的返回值并沒有被緩存(memoization),再次調(diào)用,再次進入閉包走流程。
Swift 標(biāo)準(zhǔn)庫中,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