自定義繼承自UILabel的DemoLabel。所有UIView及子類在開發(fā)中,一旦重寫了構(gòu)造函數(shù),必須要實現(xiàn)initWithCoder函數(shù),以保證純代碼和XIB/SB兩個通道。其中fatalError()方法,如果使用了XIB或SB,并且寫上了這句代碼,就會崩潰。
class DemoLabel: UILabel {
//重寫構(gòu)造函數(shù)
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
//initWithCoder 這是xib/SB的入口
//提示:所有UIView及子類在開發(fā)中,一旦重寫了構(gòu)造函數(shù),必須要實現(xiàn)initWithCoder函數(shù),以保證兩個通道
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//寫上這句代碼,如果用xib開發(fā)會崩潰,禁止xib和SB使用本類
//也就是如果使用了XIB或SB,并且寫上了這句代碼,就會崩潰
fatalError()
setupUI()
}
func setupUI() {
print("設置界面")
}
}
懶加載基本寫法。
//懶加載的基本實現(xiàn)
//1、借助關鍵詞lazy
//2、懶加載的好處:延遲創(chuàng)建、避免解包的煩惱
//3、懶加載要指明類型
lazy var label: DemoLabel = DemoLabel()
懶加載的完整寫法如下:
//懶加載本質(zhì)上是一個閉包
//僅供參考,實際開發(fā)不建議這樣寫:因為閉包中只能提示不好,而且還要注意循環(huán)引用
lazy var label = {() -> DemoLabel in
let l = DemoLabel()
return l
}()
Swift和OC中懶加載的區(qū)別:
OC中的懶加載,如果最開始調(diào)用懶加載創(chuàng)建對象,中間再次將對象設置為nil,之后會再次調(diào)用懶加載方法。
Swift中的懶加載:如果想設置對象為nil,對象必須設置為可選。并且對象一旦設置為nil,懶加載不會再次執(zhí)行。換句話說懶加載只會在第一調(diào)用的時候執(zhí)行閉包,然后將閉包的結(jié)果保存在對象的屬性中。
//懶加載
private lazy var label: UILabel? = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label?.text = "sss"
label?.sizeToFit()
print(label)
label = nil
print(label)
}
所以從上面我們可以得出:Swift中一定要注意不要主動清理視圖或空間,因為懶加載不會再次創(chuàng)建。