1. 程式人生 > >ios學習--單例實現的幾種方式

ios學習--單例實現的幾種方式

在 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
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。