單例模式用於當乙個類只能有乙個例項的時候,通常情況下這個「單例」代表的是某乙個物理裝置比如印表機,或是某種不可以有多個例項同時存在的虛擬資源或是系統屬性比如乙個程式的某個引擎或是資料。用單例模式加以控制是非常有必要的。
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 單例模式
單例模式顧名思義就是只有乙個例項,它確保乙個類只有乙個例項,並且自行例項化並向整個系統提供這個例項。它經常用來做應用程式級別的共享資源控制。這個模式使用頻率非常高,通過乙個單例類,可以實現在不同視窗之間傳遞資料。在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙...
iOS 單例模式
最近在ios開發中,需要用到單例模式,於是自己動手寫了乙個,它看起來是這樣的 1 id sharedinstance return sharedinstance 後來發現許多書上的做法都使用到了bool變數作為標值位,它看起來是這樣的 2 id sharedinstance return share...
iOS 單例模式
在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙個靜態例項,並初始化,然後設定成nil,2 實現乙個例項構造方法檢查上面宣告的靜態例項是否為nil,如果是則新建並返回乙個本類的例項,3 重寫allocwithzone方法,用來保證其他人直接使用alloc和in...