我們在進行程式開發的過程中經常會用到單例:這裡指得就是我們ARC中常見的單例:
/**
* 獲取當前類單例物件
*/
static MPConfig *object = nil;
+ (MPConfig *)shared {
static dispatch_once_t predicate = 0;
dispatch_once(&predicate, ^{ object = [[self class] new]; });
return object;
}
需要解釋的地方:
1該方法的作用就是執行且在整個程式的宣告週期中,僅執行一次某一個block物件。簡直就是為單例而生的嘛。而且,有些我們需要在程式開頭初始化的動作,如果為了保證其,僅執行一次,也可以放到這個dispatch_once來執行。
2然後我們看到它需要一個斷言來確定這個程式碼塊是否執行,這個斷言的指標一定要儲存起來。對於在應用中建立一個初始化一個全域性的資料物件(單例模式),這個函式很有用。如果同時在多執行緒中呼叫它,這個函式將等待同步等待,直至該block呼叫結束。
3這個斷言的指標必須要全域性化的儲存,或者放在靜態區內。使用存放在自動分配區域或者動態區域的斷言,dispatch_once執行的結果是不可預知的。
總結:1.這個方法可以在建立單例或者某些初始化動作時使用,以保證其唯一性。2.該方法是執行緒安全的,所以請放心大膽的在子執行緒中使用。(前提是你的dispatch_once_t *predicate物件必須是全域性或者靜態物件。這一點很重要,如果不能保證這一點,也就不能保證該方法只會被執行一次。)