Swift 中的lazy var

3,222 阅读1分钟

来源: 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的存储变量有如下优势:

  1. 闭包里面的lazy属性只有当你读的时候才会被执行。这样如果这个熟悉不会被使用(比如是用户的选择),你可以避免不必要的内存分配和计算;
  2. 你可以讲一个存储属性复制给lazy属性
  3. 你可以在闭包里通过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只能修饰structclass的成员
  • lazy变量初始化的时候不是原子性的,所以它不是线程安全的