[iOS Swift] Singleton——单例模式的使用与理解

单例模式属于创建型的设计模式。它提供了一种创建对象的最佳方式。

示例代码:

class MyClass {
    static let shared = MyClass()

    private init() {
        // Private initialization to ensure just one instance is created.
    }
}

使用方式:

let instance = MyClass.shared

// iOS 开发中常用的单例
UIApplication.shared
NSNotification.shared
NSUserDefaults.shared

理解

Swift的单行单例要怎么理解?从The Swift Programming Language(中文版)Apple Swift Blog中可以找到答案。

Swift的语法中说明,使用关键字 static 来定义类型属性。

存储型类型属性是延迟初始化的,它们只有在第一次被访问的时候才会被初始化。即使它们被多个线程同时访问,系统也保证只会对其进行一次初始化,并且不需要对其使用 lazy 修饰符。—— From The Swift Programming Language(中文版)

因此,使用static修饰的类型属性,其自带隐性的lazy修饰,且明确说明了即使它们被多个线程同时访问,系统也只进行一次初始化。

The lazy initializer for a global variable (also for static members of structs and enums) is run the first time that global is accessed, and is launched as dispatch_once to make sure that the initialization is atomic. This enables a cool way to use dispatch_once in your code: just declare a global variable with an initializer and mark it private. —— From Apple Swift Blog

这是Apple针对早期Swift版本的博客说明,这也说明了类型属性的懒加载模式和初始化的原子性。而初始化的原子性又是单例模式必须遵从的原则。

除此以外,单例模式还需遵从「构造函数必须是私有的」的这一原则,目的是为了防止使用构造函数重复初始化多个实例。因此,少了private的构造函数是不完整的单例模式!

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的。一个状态管理的例子大家都很熟悉,那就是单例。使用Swift...
    Tank丶Farmer阅读 11,511评论 0 5
  • 在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的。一个状态管理的例子大家都很熟悉,那就是单例。使用Swift...
    TomatosX阅读 4,638评论 0 1
  • 往事回忆之ObjC单例Swift是Objective-C的一种自然演变,它用如下的方式实现单例: 在这个现成方案中...
    王小宾阅读 8,360评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,120评论 19 139
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 9,787评论 2 7

友情链接更多精彩内容