来源: abhimuralidharan.medium.com/lazy-var-in…
在做iOS app 开发是要格外的对应用程序的内存关注。如果这个app被设计的很复杂,那么内存问题就会成为主要的麻烦。所以开发者需要避免做许多无谓的工作。
Swift 在语言中内置了一种机制,可以对昂贵的工作进行即时计算,它被称为lazy variable
。这种变了只有在被需要时才被创建出来,如果没有必要,比如函数永远不会被执行,那么lazy variable
将永远不会创建出来。
Apple的官方解释如下:
*A lazy stored property is a property whose initial value is not calculated until the first time it is used. You indicate a lazy stored property by writing the lazy
modifier before its declaration.
相比较存储变量,lazy
的存储变量有如下优势:
- 闭包里面的
lazy
属性只有当你读的时候才会被执行。这样如果这个熟悉不会被使用(比如是用户的选择),你可以避免不必要的内存分配和计算; - 你可以讲一个存储属性复制给
lazy
属性 - 你可以在闭包里通过
self
来访问lazy
属性。这不会造成循环引用。原因是在闭包后面会接上{}()
,这可以看成@noescape
。
class InterviewTest {
var name: String
lazy var greeting: String = {return "Hello \(self.name)"}()
// no retain cycles here....
init(name:String) {
self.name = name
}
}
let testObj = InterviewTest(name: "abhi")
testObj.greeting // Hello abhi
Lazy Rules
- 使用
lazy
时不能使用let
- 不能修饰计算属性。因为,一个计算属性每次访问是都会执行代码返回。
lazy
只能修饰struct
和class
的成员lazy
变量初始化的时候不是原子性的,所以它不是线程安全的