iOS開發之單例模式

2022-08-12 14:06:12 字數 3358 閱讀 4169

什麼是單例 ?

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。

ios開發中如何使用單例?

傳統的單例構造方法

+ (id)sharedinstance ); return sharedinstance; }

以下詳談dispatch_once建立單例

什麼是單例呢?wikipedia是如此定義的:

在軟體工程中,單例是一種用於實現單例的數學概念,即將類的例項化限制成僅乙個物件的設計模式。

或者我的理解是:

單例是一種類,該類只能例項化乙個物件。

儘管這是單例的實際定義,但在foundation框架中不一定是這樣。比如nsfilemangernsnotificationcenter,分別通過它們的類方法defaultmanagerdefaultcenter獲取。儘管不是嚴格意義的單例,這些類方法返回乙個可以在應用的所有**中訪問到的類的共享例項。在本文中我們也會採用該方法。

該函式就是dispatch_once

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
該函式接收乙個dispatch_once用於檢查該**塊是否已經被排程的謂詞(是乙個長整型,實際上作為bool使用)。它還接收乙個希望在應用的生命週期內僅被排程一次的**塊,對於本例就用於shared例項的例項化。

dispatch_once不僅意味著**僅會被執行一次,而且還是執行緒安全的,這就意味著你不需要使用諸如@synchronized之類的來防止使用多個執行緒或者佇列時不同步的問題。

如果被多個執行緒呼叫,該函式會同步等等直至**塊完成。

實際要如何使用這些呢?

好吧,假設有乙個accountmanager類,你想在整個應用中訪問該類的共享例項。你可以按如下**簡單實現乙個類方法:

+ (accountmanager *)sharedmanager );

return sharedaccountmanagerinstance; 

}

這就意味著你任何時候訪問共享例項,需要做的僅是:

accountmanager *accountmanager = [accountmanager sharedmanager];
就這些,你現在在應用中就有乙個共享的例項,該例項只會被建立一次。

該方法有很多優勢: 

1 執行緒安全

2 很好滿足靜態分析器要求

3 和自動引用計數(arc)相容 

4 僅需要少量**

該方法的劣勢就是它仍然執行建立乙個非共享的例項:

accountmanager *accountmanager = [[accountmanager alloc] init];
有些時候你希望有這種行為,但如果正在想要的是僅乙個例項被例項化就需要注意這點。

什麼是單例呢?wikipedia是如此定義的:

在軟體工程中,單例是一種用於實現單例的數學概念,即將類的例項化限制成僅乙個物件的設計模式。

或者我的理解是:

單例是一種類,該類只能例項化乙個物件。

儘管這是單例的實際定義,但在foundation框架中不一定是這樣。比如nsfilemangernsnotificationcenter,分別通過它們的類方法defaultmanagerdefaultcenter獲取。儘管不是嚴格意義的單例,這些類方法返回乙個可以在應用的所有**中訪問到的類的共享例項。在本文中我們也會採用該方法。

該函式就是dispatch_once

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
該函式接收乙個dispatch_once用於檢查該**塊是否已經被排程的謂詞(是乙個長整型,實際上作為bool使用)。它還接收乙個希望在應用的生命週期內僅被排程一次的**塊,對於本例就用於shared例項的例項化。

dispatch_once不僅意味著**僅會被執行一次,而且還是執行緒安全的,這就意味著你不需要使用諸如@synchronized之類的來防止使用多個執行緒或者佇列時不同步的問題。

如果被多個執行緒呼叫,該函式會同步等等直至**塊完成。

實際要如何使用這些呢?

好吧,假設有乙個accountmanager類,你想在整個應用中訪問該類的共享例項。你可以按如下**簡單實現乙個類方法:

+ (accountmanager *)sharedmanager );

return sharedaccountmanagerinstance; 

}

這就意味著你任何時候訪問共享例項,需要做的僅是:

accountmanager *accountmanager = [accountmanager sharedmanager];
就這些,你現在在應用中就有乙個共享的例項,該例項只會被建立一次。

該方法有很多優勢: 

1 執行緒安全

2 很好滿足靜態分析器要求

3 和自動引用計數(arc)相容 

4 僅需要少量**

該方法的劣勢就是它仍然執行建立乙個非共享的例項:

accountmanager *accountmanager = [[accountmanager alloc] init];
有些時候你希望有這種行為,但如果正在想要的是僅乙個例項被例項化就需要注意這點。

iOS開發之單例模式

單例模式是一種常用的軟體設計模式,在應用這個模式時,單例物件的類必須保證只有乙個例項存在。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。單例的實現步驟 1 重寫alloc...

iOS 開發之單例模式

單例就是工程中只初始化一次,節省記憶體空間,或者共享資源。例如在建立藍芽類,或者做wifi通訊時經常用到。也可以用來傳值。一下介紹兩種建立單例的方法 一,考慮執行緒安全的寫法 考慮執行緒安全的寫法 return modeltool物件 instancetype sharemodel return m...

ios 開發之單例模式

在ios開發中,有很多地方都選擇使用單例模式。有很多時候必須要建立乙個物件,並且不能建立多個,用單例就為了防止建立多個物件。單例模式的意思就是某乙個類有且只有乙個例項。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。一 單例模式的三要點 1.該類有且只有乙...