iOS 的單例模式 dispatch_once

來源:互聯網
上載者:User

標籤:return   建立   central   reference   post   簡單實現   obj   bsp   分析   

iOS 的單例模式 dispatch_once


      有些變數僅僅須要初始化一次(如從檔案裡讀取配置參數。讀取裝置型號等等),能夠使用dispatch_once來進行讀取最佳化。保證僅僅調用API一次,以後就僅僅要直接訪問變數就可以.

WeatherClient.h

#import "AFHTTPClient.h"

@interface WeatherClient : AFHTTPClient

+(WeatherClient *)sharedClient;

@end

WeatherClient.m

#import "WeatherClient.h"

@implementation WeatherClient

+(WeatherClient *)sharedClient
{
    static WeatherClient *sharedClient=nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{sharedClient =[[WeatherClient alloc] initWithBaseURL:[NSURL URLWithString:API]];
    });
    return sharedClient;
}

@end

在軟體project中,單例是一種用於實現單例的數學概念,即將類的執行個體化限制成僅一個對象的設計模式。
或者我的理解是:
單例是一種類。該類僅僅能執行個體化一個對象。

    雖然這是單例的實際定義,但在Foundation架構中不一定是這樣。比方NSFileManger和NSNotificationCenter。分別通過它們的類方法defaultManager和defaultCenter擷取。雖然不是嚴格意義的單例,這些類方法返回一個能夠在應用的全部代碼中訪問到的類的共用執行個體。在本文中我們也會採用該方法。    使用Objective-C實現單例模式的最佳方式向來有非常多爭論。開發人員(包含Apple在內)似乎每幾年就會改變他們的想法。

當Apple引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0),他們也引入了一個非常適合用於實現單例模式的函數。    該函數就是dispatch_once:

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
    該函數接收一個dispatch_once用於檢查該代碼塊是否已經被調度的謂詞(是一個長整型。實際上作為BOOL使用)。它還接收一個希望在應用的生命週期內僅被調度一次的代碼塊。對於本例就用於shared執行個體的執行個體化。dispatch_once不僅意味著代碼僅會被執行一次,並且還是安全執行緒的,這就意味著你不須要使用諸如@synchronized之類的來防止使用多個線程或者隊列時不同步的問題。    Apple的GCD Documentation證實了這一點:
假設被多個線程調用。該函數會同步等等直至代碼塊完畢。
    實際要怎樣使用這些呢?    好吧,如果有一個AccountManager類,你想在整個應用中訪問該類的共用執行個體。你能夠按例如以下代碼簡單實現一個類方法:
+ (AccountManager *)sharedManager { 
    static AccountManager *sharedAccountManagerInstance = nil; 
 static dispatch_once_t predicate;
 dispatch_once(&predicate, ^{       
          sharedAccountManagerInstance = [[self alloc] init]; 
     });
    return sharedAccountManagerInstance; 
}
    這就意味著你不論什麼時候訪問共用執行個體,須要做的僅是:
AccountManager *accountManager = [AccountManager sharedManager];
    就這些,你如今在應用中就有一個共用的執行個體,該執行個體僅僅會被建立一次。    該方法有非常多優勢: 
           1 安全執行緒           2 非常好滿足靜態分析器要求           3 和自己主動引用計數(ARC)相容 
           4 僅須要少量代碼    該方法的劣勢就是它仍然執行建立一個非共用的執行個體:
AccountManager *accountManager = [[AccountManager alloc] init];
    有些時候你希望有這樣的行為,但假設正在想要的是僅一個執行個體被執行個體化就須要注意這點。

 



iOS 的單例模式 dispatch_once

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.