gpt4 book ai didi

swift - 惰性属性的内存管理

转载 作者:可可西里 更新时间:2023-11-01 02:08:59 26 4
gpt4 key购买 nike

在我学习 swift 的过程中,我发现 Lazy 的概念有点困惑。

惰性属性在类实例需要或访问时初始化

   class Employee
{
var name : String
lazy var salary = Salary(Basic : 25000 ,HRA : 3000 , DA : 4000)
lazy var minExperience = 0


init(nameValue :String)
{
name = nameValue

} }

var emp1 = Employee("John") // Here the minExperience and
//salary will be nil as they are not assigned any space =

//emp1.salary.storage = nil , emp1.minExperience.storage = nil


// now access the minExperience

emp1.minExperience // using 1st time and this will return 0 ! emp1.salary.HRA // using 1st time and this will return 3000 !

所以我的问题是:

  1. 因为 minExperiencesalary 没有分配任何存储空间,所以直到我们访问它存储它的值 - 03000 ???

  2. 惰性属性的一个方面是

    Lazy properties are useful when the initial value for a property is dependent on outside factors whose values are not known until after an instance’s initialization is complete.

那为什么 Xcode 强制我们在声明时赋值??

  1. 因为我们已经为 Lazy 属性分配了一个值,显然我们不需要在我们的 init 方法中初始化它。

最佳答案

惰性变量仍然分配它需要的内存。它只是推迟了初始化代码的执行。

这是与常规变量的唯一区别,在这两种情况下,编译器都需要分配一个值(最初或第一次引用时)。

在你的例子中,

salary 似乎是惰性 var 的一个很好的候选者,因为它需要一个函数来获取初始值,并且据推测,该函数要么在您创建 Employee 对象时尚未准备好运行,要么成本太高而无法系统地执行(并且可以等待 salary 变量的实际使用)

另一方面,minExperience 不计算其初始值,也不会从惰性中获益。

如果我们没有惰性变量,我们可以使用内部变量和计算属性获得相同的结果:

 internal var _salary : Salary! = nil
var salary:Salary
{
get {
if _salary == nil
{ _salary = Salary(Basic : 25000 ,HRA : 3000 , DA : 4000) }
return _salary
}

set { _salary = newValue }
}

这(近似地)说明了编译器对惰性变量的处理。

结果是一样的,但需要更多的代码。

关于swift - 惰性属性的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41478975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com