Swift中静态变量如何存储在内存中?

4 浏览
0 Comments

Swift中静态变量如何存储在内存中?

静态变量在 Swift 中是如何存储的?

  1. 如果我从不调用 useStaticVar() 函数,那么这些变量是否被初始化?
  2. 如果我调用 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日
0
0 Comments

static var myVariable = 0
static let myConstant = 3

已经初始化。
myStringuseStaticVar 函数中进行初始化。如果您不调用它,它将保持为 nil,因为它是可选的。
static 方法无法重写。
一些有趣的信息在这里

0
0 Comments

看看这个链接:类型属性

注意

与存储实例属性不同,您必须始终为存储类型属性提供默认值。 这是因为类型本身没有初始化器,无法在初始化时将值分配给存储类型属性。

存储类型属性仅在第一次访问时进行懒惰初始化。 即使被多个线程同时访问,它们也保证仅被初始化一次,而且不需要用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()

编译器可能会对常数默认值进行一些优化,但从语义上讲没有区别。

0