第一種,使用@synchronized(self)
static LocationController *sharedInstance;
+ (LocationController *)sharedInstance {
@synchronized(self) {
if (!sharedInstance)
sharedInstance=[[LocationController alloc] init];
}
return sharedInstance;
}
@synchronized
作用:創建了一個互斥鎖,它的作用和其他語言中的互斥鎖作用一樣
解釋:這個是Objective-C中的一個鎖定令牌,方便一個對象在同一時間內被其他線程訪問,起到了線程保護的作用
使用范圍:一般在單例模式或者操作類的static變量的時候使用,即共用的變量的時候
外延:這個令牌隱式的包含了異常處理,如果你不想使用的話,就使用鎖吧
第二種,使用GCD
static LocationController *sharedInstance;
+ (LocationController *)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!sharedInstance)
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
在ios3.2上,有一種更簡單,更有效的方式實現它。就是通過Grand Central Dispatch系統。無論你何時需要在後台運行某個事務,你僅僅需要調用一下dispatch_async,然後傳需要執行的事務代碼給它即可。
其實,Grand Central Dispatch隱藏了很多後台處理細節如鎖和同步機制,並且它會根據情況創建一個新線程或使用已有的線程。
當你調用dispatch_async,你通過一個dispatch隊列,在這個隊列上存有很多block,先進先出,依次執行。
這個隊列可以使用dispatch_create自己創建,也可以調用主線程隊列dispatch_get_main_queue。這裡建立的隊列名稱是onceToken。
第三種,使用NSOperationQueue
但是,不知道從哪個版本開始,ios又對Grand Central Dispatch做了封裝,產生了一個新的類NSOperationQueue。
因此,使用NSOperationQueue就是使用Grand Central Dispatch,NSOperationQueue僅僅是建立在Grand Central Dispatch上一些簡單的API。
static LocationController *sharedInstance;
+ (LocationController *)sharedInstance {
NSOperationQueue *onceToken=[[NSOperationQueue alloc] init];
[onceToken addOperationWithBlock:^(){
if (!sharedInstance)
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}];
}
分享到: