ios學習--單例實現的幾種方式
阿新 • • 發佈:2019-01-22
在 iOS 開發過程中,我們經常會用到各種單例,例如 NSFileManager
,UIApplication
等,這些是系統給我們提供的單例類;有很多時候由於各種各樣的原因,我們自己也需要寫單例;
下面來說一下我們常用到幾種單例的實現方式:
1.第一種方式,重寫+allocWithZone:方法;
這個方法為蘋果公司官方推薦的,看這裡;但是蘋果官方的寫法中,沒有互斥鎖,這樣並不能保證在多執行緒中的執行緒安全,所以這裡我用到
@synchronized
來保證執行緒安全;
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static id instance = nil;
@synchronized (self) { //為了執行緒安全,加上互斥鎖
if (instance == nil) {
instance = [super allocWithZone:zone];
}
}
return instance;
}
2.第二種方式,不用重寫+allocWithZone:方法,而是直接用@synchronized
來保證執行緒安全,其它與上面這個方法一樣;
+(instancetype)sharedSingleton{
static id instance = nil;
@synchronized (self) {
if (!instance) {
instance = [[self alloc] init];
}
}
return instance;
}
3.第三種方式,通過 GCD 的 dispatch_once
來實現單例,同樣可以在保證執行緒安全的前提下來實現單例
+(instancetype)sharedSingleton{
static id instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
PS:swift 單例 ,還有執行緒保護
static let sharedSingleton = instance()
文/TobyoTenma(簡書作者)
原文連結:http://www.jianshu.com/p/a9e9d503806a
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。