【问题标题】:How are static variables stored in memory in Swift?Swift 中的静态变量是如何存储在内存中的?
【发布时间】:2016-01-15 15:04:04
【问题描述】:

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)
        }
    }
    

【问题讨论】:

    标签: swift


    【解决方案1】:

    检查这个: Type Properties

    注意

    与存储实例属性不同,您必须始终提供存储类型 properties 一个默认值。 这是因为类型本身没有 一个初始化器,可以为存储的类型属性赋值 初始化时间。

    存储类型属性在首次访问时延迟初始化。 它们保证只被初始化一次,即使被 多个线程同时进行,不需要标记 使用惰性修饰符。

    您必须始终为存储的类型属性提供默认值。

    您的代码缺少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()
    

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

    【讨论】:

      【解决方案2】:
      static var myVariable = 0
      static let myConstant = 3
      

      已初始化。 myString 在函数 useStaticVar 中初始化。如果您不调用它,它将保持为nil,因为它是可选的。 static 方法不能被覆盖。 一些有趣的信息是here

      【讨论】:

      • 什么时候初始化?程序何时运行?在 didFinishLaunchingWithOptions 之前?之后呢?
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2014-05-08
      • 1970-01-01
      • 2014-05-21
      • 2011-12-12
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      相关资源
      最近更新 更多