当前位置: 首页 > 知识库问答 >
问题:

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

解晟
2023-03-14

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

>

  • 如果我从未调用func usesticvar(),会发生什么?这些变量是否已初始化?

    如果我调用useStaticVar()然后再也不访问它们,会发生什么?应收账

    struct Something {
        static var myVariable = 0
        static let myConstant = 3
        static var myString: String?
    
        static func useStaticVar() {
            myVariable = myConstant
            myString = String(myVariable)
        }
    }
    
  • 共有2个答案

    班建义
    2023-03-14
    static var myVariable = 0
    static let myConstant = 3
    

    在func中初始化myString。如果不调用它,它将保持nil,因为它是可选的。静态方法不能被覆盖。这里有一些有趣的信息。

    卫宁
    2023-03-14

    选中此项:类型属性

    笔记

    与存储实例属性不同,必须始终为存储类型属性指定默认值。这是因为类型本身没有可以在初始化时为存储的类型属性赋值的初始值设定项。

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

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

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

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

     类似资料:
    • 问题内容: 例如: 这些变量将在Java,堆或堆栈存储器中存储在哪里?它们如何存储? 问题答案: 静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分。 更新说明: 请注意,只有变量及其技术值(原始或引用)存储在空间中。 如果你的静态变量是对对象的引用,则对象本身存储在堆的常规部分(青年/旧世代或幸存者空间)中

    • 问题内容: 这个问题特别是针对Java语言的。我知道所有静态代码都有一个静态的内存空间。 我的问题是此静态内存如何填充?静态对象是在导入时还是在首次引用时放入静态内存的?此外,是否将与所有其他对象相同的垃圾收集规则应用于静态对象? 问题答案: 导入与编译后的代码中的任何指令都不相关。它们建立仅在编译时使用的别名。 有一些反射性方法允许加载该类但尚未初始化,但是在大多数情况下,您可以假定只要引用了一

    • 从属性文件读取密码后,将其存储在静态变量中是否安全?我看到有一些关于密码不应存储在字符串(java)中的最佳实践,但我找不到有人讨论在应用程序的整个生命周期中如何将密码存储在静态(字符串/字符[])变量中。 将密码存储在静态变量中会导致密码暴露于外部世界的额外威胁吗?是否应该在创建与外部系统的连接后设置密码变量?

    • 问题内容: 静态变量是在程序执行的整个过程中分配的,因此堆栈和堆都不方便。那在哪呢 应该在某个地方加载它吗? 问题答案: 静态字段在加载类时被初始化,并且在卸载该类的类加载器时被丢弃。它们可以被清理,甚至可以在另一个类加载器中复制。 对于使用OSGi的此类应用程序,静态变量在整个应用程序生命周期中都不会存在,因此可以多次重装。 实现方式可能取决于JVM,但Sun / Oracle JVM创建一个“

    • 我正在调试一个我在Tomcat应用程序中多年来遇到的问题——由于Webapp类加载器无法通过气相色谱重新启动应用程序时导致的内存泄漏。我用JProfiler对堆进行了快照,似乎至少我的一些静态变量没有被释放。 某些类有一个静态 final 成员,该成员在首次加载类时初始化,并且因为它是 final,所以我无法在应用程序关闭时将其设置为 null。 静态最终变量是Tomcat中的反模式,还是我错过了

    • 问题内容: 在Objective-C中,您可以定义块的输入和输出,存储传递给方法的那些块之一,然后在以后使用该块: 因此,我试图在Swift中做到等效: 编译器不喜欢completionHandler的声明。不是我要怪它,而是如何定义一个可以在以后在Swift中设置和使用的闭包? 问题答案: 编译器抱怨 因为右侧不是适当签名的闭包,即采用float参数的闭包。以下将为完成处理程序分配“不做任何事情