概念
- 延遲加載是初始化很常用的性能優(yōu)化方式踩窖,尤其是在一些對象的屬性十分復(fù)雜的時候翘县,默認全部初始化會耗費不少時間诺擅,影響性能市袖。還有一些特定環(huán)境下才使用的對象,更是浪費資源烁涌。所以有些時候我們并不會立刻用到一個對象或者一個對象的所有屬性凌盯,使用延遲加載可以提升性能。
- 所謂延遲加載就是在第一次訪問某個屬性時烹玉,要判斷這個屬性是否已經(jīng)被初始化,如果已經(jīng)初始化則直接返回阐滩,若沒有初始化則進行初始化二打。這樣可以把這個屬性延遲初始化,把它和包含它的對象的初始化分隔開掂榔,來達到提升性能的目的继效。
使用
swift 中我們在變量屬性前加 lazy
關(guān)鍵字來指定延遲加載。
OC 中可能是這樣的:
@property (copy, nonatomic) NSString *name;
- (NSString *)name {
if (!_name) {
_name = @"Inlight";
}
return _name;
}
swift 中我們在使用 lazy
修飾屬性時装获,必須聲明屬性是變量瑞信。而且我們需要顯示的指定屬性的類型。對該屬性進行一個賦值語句用來首次訪問時使用穴豫。
swift 使用方式:
lazy var name: String = "Inlight"
lazy var planNameLabel: UILabel = {
let label = UILabel()
label.text = "yo yo yo kongfu!"
return label
}()
拓展
lazy
還可以配合 map
filter
這類接受閉包運行的方法一起凡简,使整個行為變成延遲進行的。
let numbers = 1...5
let doubleNumbers = numbers.map { (i: Int) -> Int in
print("numbers\(i)")
return i * 2
}
for i in doubleNumbers {
print("doubleNumbers\(i)")
}
打印結(jié)果:
numbers1
numbers2
numbers3
numbers4
numbers5
doubleNumbers2
doubleNumbers4
doubleNumbers6
doubleNumbers8
doubleNumbers10
使用 lazy
后得到延遲運行版本的容器
let numbers = 1...5
let doubleNumbers = numbers.lazy.map { (i: Int) -> Int in
print("numbers\(i)")
return i * 2
}
for i in doubleNumbers {
print("doubleNumbers\(i)")
}
打印結(jié)果:
numbers1
doubleNumbers2
numbers2
doubleNumbers4
numbers3
doubleNumbers6
numbers4
doubleNumbers8
numbers5
doubleNumbers10
對于一些不需要完全運行或者提前退出的情況精肃,使用 lazy
進行性能優(yōu)化更加有效秤涩。