標籤:
單例設計模式:在它的核心結構中只包含一個被稱為單例類的特殊類。例如檔案管理中的NSUserDefault,應用程式中的UIApplication,整個應用程式就這一個單例類,負責應用程式的一些操作,單例在那個檔案下都能取得到。
通過單例設計模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節省系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的選擇。
下面來點實在的,建立單例代碼上
方法1:基於安全執行緒建立一個單例
.h做一下聲明
+ (id)sharedInstanceBySynchronized;
.m實現一下單例類
+ (id)sharedInstanceBySynchronized
{
static Instance *instance;
//保證建立的單例安全執行緒
@synchronized(self){
if (instance==nil) {
instance=[[self alloc] init ];
}
}
return instance;
} 這樣就可以需要用到單例類的時候調用單例類的介面API,要先匯入標頭檔才能使用 方法2:用GCD是對線程的高度封裝,線程以後進一步詳解.h + (id)sharedInstanceByGCD;.m //利用GCD手寫單例
+ (id)sharedInstanceByGCD
{
static Instance *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance=[[self alloc ] init ];
});
return instance;
}測試一下是不是正確產生了一個單例,就需要我們自己用代碼測試,通過列印輸出兩個變數的地址,就知道是不是同一個單例類 Instance *instance1=[Instance sharedInstanceByGCD];
Instance *instance2=[Instance sharedInstanceByGCD];
NSLog(@"%@---%@",instance1,instance2);
列印輸出instance1=instance2的地址,說明通過線程鎖建立成功了單例
Instance *instance3=[Instance sharedInstanceBySynchronized];
Instance *instance4=[Instance sharedInstanceBySynchronized];
NSLog(@"%@---%@",instance3,instance4);列印輸出instance3=instance4的地址,說明通過GCD建立成功了單例 2015-11-01 22:38:04.700 單例測試效能[746:28450] 11<Instance: 0x7f99c35170c0>---<Instance: 0x7f99c35170c0>
2015-11-01 22:38:04.700 單例測試效能[746:28450] 11<Instance: 0x7f99c3630d30>---<Instance: 0x7f99c3630d30>兩個單例的地址相同,建立單例成功這裡我們做一下拓展,測試一下兩個單例的效能 代碼如下:需要用到單例需匯入單例的標頭檔可以在本檔案調用[self test1],[self test2],看一下時間差,就能知道效能的好壞 - (void)test1
{
long num=1000;
CFAbsoluteTime start=CFAbsoluteTimeGetCurrent();
for (int i=0; i<num; i++) {
Instance *inst=[Instance sharedInstanceByGCD];
}
CFAbsoluteTime end=CFAbsoluteTimeGetCurrent();
NSLog(@"test1:%f",end-start);
}
- (void)test2
{
long num=1000;
CFAbsoluteTime start=CFAbsoluteTimeGetCurrent();
for (int i=0; i<num; i++) {
Instance *ins=[Instance sharedInstanceBySynchronized];
}
CFAbsoluteTime end=CFAbsoluteTimeGetCurrent();
NSLog(@"test2:%f",end-start);
}
2015-11-01 22:38:05.880 單例測試效能[746:28450] test1:0.000168
2015-11-01 22:38:05.880 單例測試效能[746:28450] test2:0.000319
2015-11-01 22:38:08.128 單例測試效能[746:28450] test1:0.000164
2015-11-01 22:38:08.128 單例測試效能[746:28450] test2:0.000327 從列印出來的數字可以看出GCD的單例優於Synchronized的效能
iOS 中的單例設計模式