IOS設計模式 單例設計模式

2021-07-12 02:09:34 字數 1872 閱讀 3231

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

或者我的理解是: 

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

有些變數只需要初始化一次(如從檔案中讀取配置引數,讀取裝置型號等等),可以使用dispatch_once來進行讀取優化,保證只呼叫api一次,以後就只要直接訪問變數即可

範例如下:

[objc]view plain

copy

static

bool

istestmode;  

+ (bool

)istestmode  

);  

return

istestmode;  

}  

無論是愛還是恨,你都需要單例。實際上每個ios或mac os應用都至少會有 

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

儘管這是單例的實際定義,但在foundation框架中不一定是這樣。比如 

nsfilemanger和 

nsnotificationcenter,分別通過它們的類方法 

defaultmanager和 

defaultcenter獲取。儘管不是嚴格意義的單例,這些類方法返回乙個可以在應用的所有**中訪問到的類的共享例項。在本文中我們也會採用該方法。 

該函式就是 

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.封裝乙個共享的資源 2.提供乙個固定的例項建立方法 3.提供乙個標準的例項訪問...

iOS設計模式 單例模式

單例模式用於當乙個類只能有乙個例項的時候,通常情況下這個 單例 代表的是某乙個物理裝置比如印表機,或是某種不可以有多個例項同時存在的虛擬資源或是系統屬性比如乙個程式的某個引擎或是資料。用單例模式加以控制是非常有必要的。1.封裝乙個共享的資源 2.提供乙個固定的例項建立方法 3.提供乙個標準的例項訪問...

iOS設計模式 單例模式

ios 設計模式 單例模式 單例模式用於當乙個類只能有乙個例項的時候,通常情況下這個 單例 代表的是某乙個物理裝置比如印表機,或是某種不可以有多個例項同時存在的虛擬資源或是系統屬性比如乙個程式的某個引擎或是資料。用單例模式加以控制是非常有必要的。單例模式需要達到的目的 1.封裝乙個共享的資源 2.提...