ios - 单例 VS 静态(类)变量

标签 ios swift macos

<分区>

Swift 中的最佳实践是什么?

选项 1:

class SomeManager {

    static var sharedManager = SomeManager()

    var someVariable: String?

}

然后

let something = SomeManager.sharedManager().someVariable

选项 2:

class SomeManager {

    static var someVariable: String?

}

然后

let something = SomeManager.someVariable

最佳答案

tl;dr

因为需要其他实例而存储可变状态时的选项 1(类或结构)。

当您想要存储静态变量时的选项 2(范围内的全局变量),因为它更快并且使用更少的内存。

带有变量的单例类(或结构)

全局状态通常被认为是“坏事”。这很难考虑,会导致问题,但有时是不可避免的。

  • 如果您想拥有多个 SomeManager 实例,请创建一个类。
  • 单例可以是很好的默认实例,但在某些极端情况下您可能希望具有单独的行为(测试)。
  • 依赖注入(inject)...如果 SomeManager 正在存储全局状态,那么这是一个相关的大话题。

静态变量

  • 总是在 someVariable 是常量时使用。
  • static var sharedManager = SomeManager() 不需要额外的存储空间;你只使用你实际需要的内存。
  • 稍微快一些,因为您不需要将 sharedManager 加载到内存中然后访问它的成员 someVariable。您直接访问 someVariable

额外提示:

在选项 2 中,您可以创建 SomeManager,即使它什么都不做。您可以通过将 SomeManager 转换为没有大小写的枚举来防止这种情况。

enum SomeManager {
    static var someVariable: String?
}

您仍然可以这样做:

SomeManager.someVariable

但是你不能这样做

let manager = SomeManger()

关于ios - 单例 VS 静态(类)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36312461/

相关文章:

python - Qt:尝试在 qt 中使用 python.h 时 undefined symbol

macos - View Controller 可以拥有一张工作表吗?

ios - 具有 3 个表的 UINavigationController

ios - ld : 4 duplicate symbols for architecture armv7 FireBase Google

iphone - 使用 Storyboard连接 TableView 和 View Controller 之间的导出

ios - 将 ARCharts 框架/项目导入 Swift 项目

ios - 快速设置 Root View Controller 时删除新创建的导航栏

ios - 快速关闭不能覆盖任何

ios - 使用 SwiftyJSON 的未解析标识符 JSON

Swift - 如何在菜单栏应用程序中跨窗口共享类(作为单例)?