[iOS Swift] Singleton——單例模式的使用與理解

單例模式屬于創(chuàng)建型的設(shè)計模式。它提供了一種創(chuàng)建對象的最佳方式。

示例代碼:

class MyClass {
    static let shared = MyClass()

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

使用方式:

let instance = MyClass.shared

// iOS 開發(fā)中常用的單例
UIApplication.shared
NSNotification.shared
NSUserDefaults.shared

理解

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

Swift的語法中說明,使用關(guān)鍵字 static 來定義類型屬性。

存儲型類型屬性是延遲初始化的,它們只有在第一次被訪問的時候才會被初始化。即使它們被多個線程同時訪問,系統(tǒng)也保證只會對其進行一次初始化,并且不需要對其使用 lazy 修飾符?!?From The Swift Programming Language(中文版)

因此,使用static修飾的類型屬性,其自帶隱性的lazy修飾,且明確說明了即使它們被多個線程同時訪問,系統(tǒng)也只進行一次初始化。

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版本的博客說明,這也說明了類型屬性的懶加載模式和初始化的原子性。而初始化的原子性又是單例模式必須遵從的原則。

除此以外,單例模式還需遵從「構(gòu)造函數(shù)必須是私有的」的這一原則,目的是為了防止使用構(gòu)造函數(shù)重復(fù)初始化多個實例。因此,少了private的構(gòu)造函數(shù)是不完整的單例模式!

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在之前的帖子里聊過狀態(tài)管理有多痛苦,有時這是不可避免的。一個狀態(tài)管理的例子大家都很熟悉,那就是單例。使用Swift...
    Tank丶Farmer閱讀 6,557評論 0 5
  • 在之前的帖子里聊過狀態(tài)管理有多痛苦,有時這是不可避免的。一個狀態(tài)管理的例子大家都很熟悉,那就是單例。使用Swift...
    TomatosX閱讀 1,087評論 0 1
  • 往事回憶之ObjC單例Swift是Objective-C的一種自然演變,它用如下的方式實現(xiàn)單例: 在這個現(xiàn)成方案中...
    王小賓閱讀 3,259評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,478評論 2 7

友情鏈接更多精彩內(nèi)容