iOS 中的單例設計模式

來源:互聯網
上載者:User

標籤:

單例設計模式:在它的核心結構中只包含一個被稱為單例類的特殊類。例如檔案管理中的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 中的單例設計模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.