内容简介:这篇文章解释了在 Swift 中懒加载变量是如何工作的,你必须对闭包有一些了解。当我们进行 iOS 开发时,我们应该非常关注应用程序的内存占用情况。如果应用程序很复杂,那么内存问题就会是对于开发者的一个主要的挑战。所以,首先考虑到内存分配问题的开发者能够真正的写出优化的代码。除非确实有必要,否则开发者要避免做一些耗时的工作。那些复杂的分配内存操作会消耗更多的时间,并且对于程序的性能有严重的影响。
这篇文章解释了在 Swift 中懒加载变量是如何工作的,你必须对闭包有一些了解。
当我们进行 iOS 开发时,我们应该非常关注应用程序的内存占用情况。如果应用程序很复杂,那么内存问题就会是对于开发者的一个主要的挑战。所以,首先考虑到内存分配问题的开发者能够真正的写出优化的代码。除非确实有必要,否则开发者要避免做一些耗时的工作。那些复杂的分配内存操作会消耗更多的时间,并且对于程序的性能有严重的影响。
Swift 有内置在语言中的机制,可以即时的计算那些耗时工作。它叫做 懒加载变量 。这种变量只有在你第一次需要它的时候才被指定的方法创建。如果从没有使用过该变量。那么方法就不会运行,所以它可以帮助减少一些处理时间。
苹果的官方文档写道:
一个懒加载储存属性是种只有在首次使用时,才计算其初始值的属性。你可以通过在声明前加 lazy
修饰符来标示一个懒加载存储属性。
你必须将一个懒加载属性声明为一个变量(通过 var
关键字),因为它的初始化值也许不能获得,直到实例的初始化完成。常量属性在初始化完成 之前 一定会有一个值,因此不能用懒加载声明。
为了解释这些,我会使用一个很基础的示例:假设有一个结构体叫做 InterviewCandidate。它有一个可选的布尔值,决定候选人正在申请 iOS 或者 Android。iOSResumeDescription 和 androidResumeDescription 被声明为懒加载属性。那么在下面的代码中,一个人是 iOS 开发者,懒加载变量 iOSResumeDescription 将会在调用打印方法的时候被初始化。没有被调用的 androidResumeDescription 就会是 nil。
//: Playground - noun: 人们用来玩耍的地方 import UIKit struct InterviewCandidate { var isiOS:Bool? lazy var iOSResumeDescription: String = { return "I am an iOS developer" }() lazy var androidResumeDescription: String = { return "I am an android developer" }() } var person1 = InterviewCandidate() person1.isiOS = true if person1.isiOS! { print(person1.iOSResumeDescription) } else { print(person1.androidResumeDescription) } 复制代码
这是一个非常基础的例子。如果我们有一个复杂的类或结构,它包含从循环的函数返回结果的计算变量,并且如果我们创建 1000 个这样的对象,那么性能和内存将会受到影响。
懒加载存储属性 vs 存储属性
这有一些懒加载属性相对于存储属性的优点。
-
只有在读取懒加载属性时,才会执行与该属性关联的闭包。 因此,如果由于某种原因该属性未被使用(可能是因为用户的某些决定),则可以避免不必要的分配和计算。
-
你可以使用一个存储属性给懒加载属性赋值。
-
注意你能够在懒加载的属性闭包内部使用
self
。这不会导致任何循环引用。原因在于它立即使用的这个闭包{}()
被认为是@noescape
。它不会引用捕获的self
。
但是,如果你在 方法 中使用 self
。事实上,如果你正在使用的是一个类而不是结构体,你也应该在你的方法内声明 [unowned self]
那样你才不会创建一个强引用(查看下面的代码)。
// playground code import UIKit import Foundation class InterviewTest { var name: String lazy var greeting : String = { return “Hello \(self.name)” }() // 这里没有循环引用 .. init(name: String) { self.name = name } } let testObj = InterviewTest(name:”abhi”) testObj.greeting 复制代码
你能够引用这个变量,无论你是否使用了闭包。
lazy var iOSResumeDescription = “I am an iOS developer” 复制代码
这样的语法也可以运行。
注意:记住,懒加载属性的用途是只有它们第一次被需要的时候才会被计算,在这之后它们的值就被存储下来了。所以,如果你第二次使用 iOSResumeDescription
,预先存储的属性就会返回。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。