【问题标题】:Why do Singleton's capture an instance of themselves?为什么 Singleton 会捕获自己的实例?
【发布时间】:2019-06-13 10:19:00
【问题描述】:

我试图了解当我们在 Singleton 自己的类声明中创建 Singleton 对象的第一个实例时,在较低级别会发生什么。

据我了解,static 关键字允许标记的属性或方法在类的所有实例之间共享,我敢肯定它在这里的作用我没有完全看到。

此外,当我们考虑在编译/运行时创建实例时,这是如何工作的?

这是一个单例类声明的示例:

class Person {
    static let details = Person()
    var name = "Alan Turing"
    let age = "42"
}

我知道类及其属性只会被创建一次,并且对类对象的任何引用都将指向内存中的同一点。我的困惑特别是为什么我们在其自身中创建单例的第一个实例。

【问题讨论】:

  • 您还想在哪里创建这个实例?你可以在你想要的地方创建它
  • 单例模式的重点是只有一个实例,并阻止创建更多实例。如果您允许在类之外创建实例,就不能阻止人们创建第二个或第三个实例,对吗?
  • 另外它很懒,只有第一次调用它才会得到init
  • 好点!我没有那样想。

标签: swift static singleton


【解决方案1】:

基本上static 变量是始终可以通过类本身访问的类变量。 我建议阅读statichere的更深入的解释

通过在包含类本身对象的类中使用静态变量,您可以确保在运行时已经存在该类的对象(或至少在第一次访问 Person.instance 时)。 对于 Swift 中真正的 singleton,必须将 init 设为该类的 private,如下所示:


public class Person {
    static let instance = Person()
    var name: String
    let age: Int

    private init() {
        self.name = "Alan Turing"
        self.age = 42
    }
}

这样可以确保在任何给定时间确实只有一个对象存在(因此名称为singleton)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2011-01-16
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多