Swift中静态变量如何存储在内存中?
Swift中静态变量如何存储在内存中?
静态变量在 Swift 中是如何存储的?
- 如果我从不调用 useStaticVar() 函数,那么这些变量是否被初始化?
- 如果我调用 useStaticVar() 函数,然后再也不访问它们会发生什么?
struct Something { static var myVariable = 0 static let myConstant = 3 static var myString: String? static func useStaticVar() { myVariable = myConstant myString = String(myVariable) } }
admin 更改状态以发布 2023年5月22日
static var myVariable = 0 static let myConstant = 3
已经初始化。
myString
在 useStaticVar
函数中进行初始化。如果您不调用它,它将保持为 nil
,因为它是可选的。
static
方法无法重写。
一些有趣的信息在这里。
看看这个链接:类型属性
注意
与存储实例属性不同,您必须始终为存储类型属性提供默认值。 这是因为类型本身没有初始化器,无法在初始化时将值分配给存储类型属性。
存储类型属性仅在第一次访问时进行懒惰初始化。 即使被多个线程同时访问,它们也保证仅被初始化一次,而且不需要用lazy修饰符标记。
您必须始终为存储类型属性提供默认值。
在这种情况下,您的代码缺少myString
的默认值,Swift会默认为nil
。
存储类型属性仅在第一次访问时进行懒惰初始化。
您可以通过以下类似代码测试和查看存储类型属性如何初始化:
func ZeroGenerator() -> Int { print(#function) return 0 } func ThreeGenerator() -> Int { print(#function) return 3 } func NilGeneartor() -> String? { print(#function) return nil } struct Something { static var myVariable = ZeroGenerator() static let myConstant = ThreeGenerator() static var myString: String? = NilGeneartor() static func useStaticVar() { print(#function) myVariable = myConstant myString = String(myVariable) } } Something.useStaticVar()
输出:
useStaticVar() ZeroGenerator() ThreeGenerator() NilGeneartor()
编译器可能会对常数默认值进行一些优化,但从语义上讲没有区别。