[iOS]單例的創建方法

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

在iOS應用中,單例非常常見,下面先列舉幾個系統的單例:

[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSBundle mainBundle]
[NSFileManager defaultManager]
... ... 還有很多!


下面列舉下單例的幾種創建方法

// 方法1,創建全局靜態變量,在調用單例方法時候,判斷是否創建,如果爲nil,則創建。 
// 缺點:多線程不安全,並且不能被繼承

static ShareData *g_sharedData = nil; 
+ (ShareData *)shared
{
	if (g_sharedData == nil) {
		g_sharedData = [[ShareData alloc] init];
	}
	return g_sharedData;
}
// 方法2:採用線程安全的方式創建單例。
// 缺點:不能被繼承
+ (ShareData *)shared 
{
	static ShareData *g_sharedData = nil;
	static dispatch_once_t onceToken;
	dispatch_once(&onceToken, ^{ 
		g_sharedData = [[ShareData alloc] init];
	}); 
	return g_shareData;
}

// 方法3:採用線程安全的方式創建單例。

+ (ShareData *)shared
{
	static ShareData *g_sharedData = nil;
	static dispatch_once_t onceToken;
	dispatch_once(&onceToken, ^{
        // 調用初始化方法
		g_sharedData = [NSAllocateObject([self class],0,NULL) init];
        // ARC : g_sharedData = [[self alloc] init];
	});
	return g_shareData;
}



剛開始學習iOS開發的時候,使用的方法1創建。看到別人的代碼中是這樣,自己也就這樣做了。後來看了很多國外開源的庫的部分源碼,偶然發現用GCD來創建單例,就細看了一下。希望給初學者一個借鑑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章