Lazy Initialization,简单来说,就是在需要用到这个属性时,再对它进行初始化,以达到优化性能的作用。
Objective-C中的延时初始化
//ClassA.h
@property (nonatomic, strong) NSMutableArray *players;
//ClassA.m
-(NSMutableArray *)players {
if(!_players) {
_players = [[NSMutableArray alloc] init];
}
return _players;
}
初始化ClassA后,_players是nil,只有当访问players属性时,getter方法才会被调用,并进行初始化。可见,属性初始化在对象初始化之后。
Swift中的延时初始化
- 使用场景一:对象初始化前,属性的初始值未知。比如在这个例子中,personalizedString包含name,所以只有在初始化对象后才能获得name。
class Person {
var name:String
lazy var personalizedString: String = {
[unowned self] in
return "Hello,\(self.name)!"
}()
init(name: String) {
self.name = name
}
}
//初始化Person时,personalizedString还没有被创建
let person = Person(name:“Magenta”)
//当使用personalizedString时,它被创建出来,并且包含了name
print(person.personalizedString)
//输出“Hello,Magenta!"
- 使用场景二: 某个属性的值需要密集的计算
class MathHelper {
lazy var pi : Double = {
//计算pi的值
return resultsOfCalculation
}()
}