iOS設計模式 單例模式

2021-07-12 07:11:00 字數 2351 閱讀 9463

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

1.封裝乙個共享的資源

2.提供乙個固定的例項建立方法

3.提供乙個標準的例項訪問介面

本文以建立乙個mysingletonclass的單例模式為例。首先,我們需要定義乙個類mysingletonclass.

[cpp]view plain

copy

@inte***ce mysingletonclass:nsobject   

並且為其新增乙個類方法(注意,這裡不是例項方法)+(

id)sharedinstance;乙個基本的實現寫法如下:

[cpp]view plain

copy

static mysingletonclass *sharedcldelegate = nil;  

+(mysingletonclass *)sharedinstance  

}  return sharedcldelegate;  

}  

在上面的**中(用到了關鍵字@synchronized是為了保證我們的單例的執行緒級別的安全,可以適用於多執行緒模式下。)static變數sharedcldelegate用於儲存乙個單例的指標,並且強制所有對該變數的訪問都必須通過類方法+(

id)sharedinstance,在對+(

id)sharedinstance第一次呼叫時候完成例項的建立。這裡值得留意一下的是,上面**中用的是[[

self

class

] alloc],而不是[mysingletonclass alloc],一般情況下這兩種寫法產生同樣的效果,但是這裡這樣做是為了更好的利用oop的性質,[

self

class

]可以動態查詢並確定類的型別從而便於實現對該類的子類化。

為了完全的實現例項的單態性,必須通過一定手段來避免例項多次被建立。+(id)sharedinstance控制了單例的建立和訪問,但是並不能控制其它地方的**通過alloc方法來建立更多的例項,因此我們還要過載任何乙個涉及到allocation的方法,這些方法包括   +new, +alloc,+allocwithzone:, -copywithzone:, 以及 -mutablecopywithzone: 另外,+(id)sharedinstance也需要稍作修改。

[cpp]view plain

copy

+ (id)hiddenalloc  

+ (id)alloc  

+ (id)new

+(id)allocwithzone:(nszone*)zone  

-   (id)copywithzone:(nszone *)zone  

- (id)mutablecopywithzone:(nszone *)zone  

+(id)sharedinstance修改如下:  

+ (mysingletonclass *)sharedinstance   

}  return sharedcldelegate;  

}  

如果不考慮類的子類化,+hiddenalloc這個方法可以省略。由於我們是用[

self

class

]來實現型別的動態識別,用[[

self

class

] hiddenalloc]可以避免呼叫到被過載過的alloc方法。此外,hiddenalloc也為可能的子類化提供了乙個呼叫原始alloc方法的機會。上面過載過的alloc方法只是給出乙個log資訊並且返回nil。copying方法裡只是簡單的增加了retain的計數並沒有返回乙個新的例項。這也正體現了單例模式的性質,因為技術上來講,拷貝乙個單例是錯誤的(因為是「單例」)所以在copywithzone方法中我們給出了乙個錯誤資訊,當然也可以扔出乙個exception。

[cpp]view plain

copy

+ (void)attemptdealloc    

值得注意的是,上面這個attemptdealloc方法顧名思義,只是試圖釋放掉這個單例。如果retain的計數不為1,說明還有其他地方對該單例傳送過retain訊息。考慮到乙個單例模式的生存週期是整個程式結束為止。所以,在程式的任何乙個地方都沒有必要向這個單例傳送retain訊息,即便是對這個單例有引用。而是呼叫sharedinstance方法來引用這個單例,這樣做是安全的,也是合乎單例模式的技術含義的。

ios如果本文有任何錯誤之處,歡迎拍磚指正,共同進步, 謝謝!

iOS設計模式 單例模式

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

iOS設計模式 單例模式

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

iOS設計模式 單例模式

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