1. swift中也有懒加载的方式
1. (苹果的设计思想:希望所有的对象在使用时才真正加载到内存中)
2. 和OC不同的是swift有专门的关键字来实现懒加载
3. lazy关键字可以用于定义某一个属性懒加载
懒加载的使用
- 格式
lazy var 变量: 类型 = { 创建变量代码 }()
// 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性
// lazy的作用是只会赋值一次
lazy var array : [String] = {
return ["why", "lmj", "lnj"]
}()
延迟存储属性
1. 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用lazy来标示一个延迟存储属性
2. 最常见的延迟存储属性
1. 执行某个方法返回处理好的数据
2. 执行某个闭包返回处理好的数据
3. 注意
1. 必须将延迟存储属性声明成变量(使用var关键字),因为属性的初始值可能在实例构造完成之后才会得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性
2. 如果一个被标记为lazy的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次
// 推荐写法
lazy var listData: [String] = {
print("执行了")
return ["lmj", "lnj", "zs"]
}()
// 等价于:
lazy var listData: [String] = self.test()
func test() -> [String] {
print("执行了")
return ["lmj", "lnj", "zs"]
}
// 等价于:
lazy var listData: [String] = {
()->[String] in
print("执行了")
return ["lmj", "lnj", "zs"]
}()
// 等价于:
lazy var listData = {
()->[String] in
print("执行了")
return ["lmj", "lnj", "zs"]
}()
// 下述情况无法保证只被初始化1次
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print(listData)
print(listData)
print(listData)
}