iOS開發(OC和Swift)中的單例模式

單例模式在程序設計中是一種很重要的設計模式,它的核心思想是單例類在應用程序的整個生命周期中的實例都只存在一個(當然也可以不存在).

不管哪種編程語言,單例的底層實現方法都是差不多的,就是使用類的私有靜態指針變量指向類的唯一實例,并用一個僅有的靜態方法來獲取該實例.

舉個例子:

我們辦公室里有5個人,然后辦公室里有一臺打印機.辦公室里所有人的電腦都連接著這個打印機,但是不管誰要打印東西,都要通過這個唯一的打印機,所以我們辦公室里的這臺打印機就可以理解為"打印機類"的單例對象.這樣設計的好處就是可以節約資源,減少不必要的請求等.

在iOS開發中,經常會用到單例,比如我們常用的NSUserDefaults(Swift中為UserDefaults)類,就是一個單例類,原因很明顯,不管什么時候往里面寫東西,其實都是對同一個實例進行操作,不管什么時候往外讀取,也都是從這個實例進行操作,所以就有了

[NSUserDefaults standardUserDefaults];

(UserDefaults.standard)

一般情況下,使用"shared" ?"sharedInstance" ?"default" ?"standard"等字樣的,就是單例.


我們在自己開發的過程中,也可以參考這種單例模式,比如說一個Singleton單例類


在OC中設計單例:

在.h文件中開放單例類方法的接口:

+ (instanceType)sharedInstance;

在.m文件中實現如下:

首先聲名一個靜態對象:

static Singleton *sharedInstance = nil;


然后使用GCD中的dispatch_once_t實現接口中的單例類方法

+ (instanceType )sharedInstance {

? ? ? ? static dispatch_once_t once;

? ? ? ? dispatch_once(&once, ^{

? ? ? ? ? ? ? ? sharedInstance = [[self ?alloc] ?init];

? ? ? ? });

? ? ? ? return ?sharedInstance;

}

這樣在其他地方就可以使用

[Singleton? sharedInstance];

來獲取該單例對象了.


在Swift(3.0之后)設計單例:

swift中實現單例設計簡單到爆:

固定寫法:

static let sharedInstace = Singleton.init()

這樣通過

Singleton.sharedInstace

就可以獲取單例對象了.

但是這樣做,在使用中仍然可以通過

Singleton.init()

來初始化一個非單例對象,為了明確告訴使用者應當使用單例,可以單例類中再加一句代碼:

private override init() {}

將默認的init()方法重寫為私有方法,這樣在使用時直接調用init()方法就會報錯.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 單例:意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。這個類稱為單...
    CoderZS閱讀 613評論 1 13
  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,292評論 4 34
  • 在之前的帖子里聊過狀態管理有多痛苦,有時這是不可避免的。一個狀態管理的例子大家都很熟悉,那就是單例。使用Swift...
    Tank丶Farmer閱讀 6,413評論 0 5
  • 在開發中經常會用到單例設計模式,目的就是為了在程序的整個生命周期內,只會創建一個類的實例對象,而且只要程序不被殺死...
    不要重名就好閱讀 556評論 0 0
  • 在一個ios應用中,有時候我們只需要某個類的一個實例。即是在整個項目中,這個類的對象只能被初始化一次。 例如,當應...
    蠡園里面有李源閱讀 514評論 1 0