【问题标题】:How to Create Singleton Object in swift如何快速创建单例对象
【发布时间】:2015-09-11 00:37:16
【问题描述】:

我正在以快速有效的方式学习单例模式来创建单例类,并找到了如下创建的最佳方式。

class SingletonClass{
    static let sharedInstance = SingletonClass()
}

由于我使用了let 语句,它是只读属性并且必须是线程安全的,因此从Objective C 开始就不需要dispatch_once()。而static 用于制作sharedInstance 变量我猜是class 变量。

但这如何保证在整个应用程序中只创建一个实例?是我遗漏了一件小事吗?

【问题讨论】:

  • 你认为这个类有多少个副本(相对于这个类的objects)?
  • 这个类的一个副本......但我可以在很多地方以 SingletonClass.sharedInstance 的形式访问它......
  • 您是否建议以某种方式访问​​它会产生更多副本?
  • 可以创建多个 singletonclass 实例,但是 sharedInstance 只能创建一次。
  • @copeME 它是一个不可变的静态变量。一旦它被创建,它就不能被重新分配,因为它是用 let 创建的。由于它是一个静态变量,所以它与类相关联,而不是类的实例。

标签: ios swift singleton


【解决方案1】:

如果你想阻止你的类的实例化(有效地限制只使用单例),那么你将你的初始化器标记为private

class SingletonClass {

    static let shared = SingletonClass()

    private init() {
        // initializer code here
    }
}

【讨论】:

  • 但我能够创建一个对象..它不会给我在操场上创建对象的错误
  • @copeME:私有方法只能从它们被声明的文件中调用。
【解决方案2】:

保证它只被创建一次的是关键字static。你可以参考这篇文章: https://thatthinginswift.com/singletons/

希望对您有所帮助。

static 关键字表示成员变量或方法可以 无需实例化它所访问的类即可访问 属于。简单来说就是可以调用一个方法,即使 你从未创建过它所属的对象

【讨论】:

  • 你只是不声明静态,所以你不需要创建一个对象来访问变量?更具体地说,为什么在这种情况下声明静态?
【解决方案3】:

进行私有初始化,例如:

final class Singleton {

    // Can't init is singleton
    private init() { }

    //MARK: Shared Instance

    static let sharedInstance: Singleton = Singleton()

    //MARK: Local Variable

    var emptyStringArray : [String] = []

}

【讨论】:

    【解决方案4】:

    你是对的。您可能想阅读Files and Initialization,了解 Swift 中如何处理全局变量和静态变量

    Swift 使用这种方法

    懒惰地初始化,第一次运行全局初始化器 被引用,类似于Java。

    它说

    它允许自定义初始化程序,Swift 中的启动时间可以干净地缩放 没有全局初始化器来减慢它的速度,并且顺序 执行是完全可预测的。

    全局变量的惰性初始化器(也适用于 structs 和 enums)在第一次访问 global 时运行,并且 以dispatch_once 启动,以确保初始化是 原子。这为在代码中使用 dispatch_once 提供了一种很酷的方式: 只需使用初始化程序声明一个全局变量并标记它 私人的。

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2015-10-21
      • 2020-08-20
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2018-03-06
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多