oc懶加載
oc懶加載機制充分使用了oc點語法的特性寨辩。舉個例子
@interface MyView()
@property (nonatomic, strong) UIView *view;
@end
@implementation MyView
- (instancetype)init {
if (self = [super init]) {
[self constructSubviews];
}
return self;
}
- (void) constructSubviews {
[self addSubview:self.view];
}
- (UIView *)view {
if (nil == _view) {
_view = [[UIView alloc] init];
}
return _view;
}
@end
上面這個例子定義了view屬性,當(dāng)MyView被創(chuàng)建的時候并沒有立馬對view屬性進行初始化,當(dāng)代碼執(zhí)行到[self addSubview:self.view]
的時候螟蒸,view屬性被首次使用萄窜,self.view會去執(zhí)行view屬性的get方法,首次使用的時候_view == nil
,所以會進入if條件分支創(chuàng)建view,當(dāng)下次再次通過點語法訪問view的時候(self.view),再次進入get方法费变,而這個時候?qū)⒉辉龠M入條件分支攘须,將之前創(chuàng)建好的對象直接返回,這就是oc懶加載的機制殴泰。
swift懶加載
swift中有個關(guān)鍵字lazy于宙,通過lazy修飾成員變量使之具有懶加載特性。舉個例子
class ViewController: UIViewController {
lazy var view: UIView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
print(view)
print(view)
view = nil
print(view)
}
}
上面這個例子ViewController被創(chuàng)建的時候成員變量view并不會被創(chuàng)建悍汛,當(dāng)執(zhí)行print(view)
的時候捞魁,view首次被使用,這個時候才會真正的被創(chuàng)建离咐,當(dāng)再次執(zhí)行print(view)
谱俭,可以看出他們的內(nèi)存地址是一樣的奉件,從而證明他們是同一個對象,當(dāng)給view設(shè)置為nil后再去使用view的話昆著,view將不在重新創(chuàng)建县貌,這點和OC懶加載不同,oc是通過點語法凑懂,設(shè)置nil后煤痕,再次通過點語法去取值,會重新進入get方法中的條件分支重新分配新的內(nèi)存創(chuàng)建一個新的對象接谨。
綜上可以得出一個結(jié)論摆碉,swift懶加載只會在首次使用的時候創(chuàng)建一次,之后再次使用或者新賦值都不會去重新創(chuàng)建了脓豪,而是就保存新設(shè)置的值巷帝。
swift懶加載的寫法舉例
lazy var tLabel: TestLabel = TestLabel() // 通過構(gòu)造函數(shù)初始化
lazy var tLabel: TestLabel = TestLabel.creatTesstLabel() // 通過類方法創(chuàng)建(也可通過對象調(diào)方法創(chuàng)建)
// 通過匿名方法(閉包)創(chuàng)建
lazy var tLabel: TestLabel = {
let l = TestLabel()
// 設(shè)置label屬性....
return l
}()
lazy var tLabel = { () -> TestLabel in
let l = TestLabel()
// 設(shè)置label屬性....
return l
}()
總之結(jié)論就是等號后面的代碼能返回和變量類型匹配的值