自定義繼承自UILabel的DemoLabel搔耕。所有UIView及子類在開(kāi)發(fā)中,一旦重寫了構(gòu)造函數(shù)痰娱,必須要實(shí)現(xiàn)initWithCoder函數(shù)弃榨,以保證純代碼和XIB/SB兩個(gè)通道。其中fatalError()方法梨睁,如果使用了XIB或SB鲸睛,并且寫上了這句代碼柜与,就會(huì)崩潰通铲。
class DemoLabel: UILabel {
//重寫構(gòu)造函數(shù)
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
//initWithCoder 這是xib/SB的入口
//提示:所有UIView及子類在開(kāi)發(fā)中,一旦重寫了構(gòu)造函數(shù)贮折,必須要實(shí)現(xiàn)initWithCoder函數(shù)遍坟,以保證兩個(gè)通道
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//寫上這句代碼拳亿,如果用xib開(kāi)發(fā)會(huì)崩潰,禁止xib和SB使用本類
//也就是如果使用了XIB或SB政鼠,并且寫上了這句代碼风瘦,就會(huì)崩潰
fatalError()
setupUI()
}
func setupUI() {
print("設(shè)置界面")
}
}
懶加載基本寫法。
//懶加載的基本實(shí)現(xiàn)
//1公般、借助關(guān)鍵詞lazy
//2万搔、懶加載的好處:延遲創(chuàng)建、避免解包的煩惱
//3官帘、懶加載要指明類型
lazy var label: DemoLabel = DemoLabel()
懶加載的完整寫法如下:
//懶加載本質(zhì)上是一個(gè)閉包
//僅供參考瞬雹,實(shí)際開(kāi)發(fā)不建議這樣寫:因?yàn)殚]包中只能提示不好,而且還要注意循環(huán)引用
lazy var label = {() -> DemoLabel in
let l = DemoLabel()
return l
}()
Swift和OC中懶加載的區(qū)別:
OC中的懶加載刽虹,如果最開(kāi)始調(diào)用懶加載創(chuàng)建對(duì)象酗捌,中間再次將對(duì)象設(shè)置為nil,之后會(huì)再次調(diào)用懶加載方法。
Swift中的懶加載:如果想設(shè)置對(duì)象為nil胖缤,對(duì)象必須設(shè)置為可選尚镰。并且對(duì)象一旦設(shè)置為nil,懶加載不會(huì)再次執(zhí)行哪廓。換句話說(shuō)懶加載只會(huì)在第一調(diào)用的時(shí)候執(zhí)行閉包狗唉,然后將閉包的結(jié)果保存在對(duì)象的屬性中。
//懶加載
private lazy var label: UILabel? = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label?.text = "sss"
label?.sizeToFit()
print(label)
label = nil
print(label)
}
所以從上面我們可以得出:Swift中一定要注意不要主動(dòng)清理視圖或空間涡真,因?yàn)閼屑虞d不會(huì)再次創(chuàng)建分俯。