單例-------OC中單例 / Swift中單例


單例 :通常應用在 網絡工具、音頻工具安全


OC中單例寫法: 網絡


+ (instancetype)sharedTools {多線程

   

    static id instance;  //存儲在靜態區函數

  

    static dispatch_once_t onceToken; // dispatch_once_t 長整型  若是 onceToken 爲0,就執行block中的代碼, 只執行一次(一次性執行)工具

    

    dispatch_once(&onceToken, ^{spa

        instance = [[self alloc] init];  //dispatch_once 只是對這句代碼加鎖,保證block中的代碼只執行一次.net

    });線程

    

    return instance;3d

}code



Swift中單例寫法: 


法一:

  // 如下代碼仿 OC 的寫法!

    // Swift 中不容許在函數中定義靜態成員

    static var instance: SoundTools?

    

    static var onceToken: dispatch_once_t = 0

    

    // 1. 提供全局的訪問點

    class func sharedTools() -> SoundTools {    // class func類函數    //func 函數

        

        dispatch_once(&onceToken) { () -> Void in

            instance = SoundTools()

        }

        

        return instance!    //解包

    }


法二:

// 靜態區的對象只能設置一次數值

static let sharedTools = SoundTools()


法三:

// Swift 中的的單例寫法和懶加載幾乎同樣 `static let`

    // 一樣也是在第一次使用時,纔會建立對象

    static let sharedTools: SoundTools = {

       

        print("建立聲音對象")

        

        return SoundTools()

    }()



附:

iOS4版本以前

  static SingleClassManager *singleManager = nil;
     +(SingleClassManager*)sharedManager
     {
             @synchronized(self)  //同步加鎖,在多線程中使用,可使線程安全
             {             
                   if(singleManager == nil)
                    {
                              singleManager = [[SingleClassManager alloc]init];
                    } 
              }
           return singleManager;
      }

iOS5版本開始(block函數)

+ (DSLocationManager *)shareInstance{

    static DSLocationManager *manager = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[DSLocationManager alloc]init];
    });
    
    return manager;
}

    該方法有不少優點: 

           1 線程安全

           2 很好知足靜態分析器要求

           3 和自動引用計數(ARC)兼容 

           4 僅須要少許代碼

     說明:

            該函數接收一個dispatch_once用於檢查該代碼塊是否已經被調度的謂詞(是一個長整型,實際上做爲BOOL使用)。它還接收一個但願在應用的生命週期內僅被調度一次的代碼塊,對於本例就用於shared實例的實例化。

dispatch_once不只意味着代碼僅會被運行一次,並且仍是線程安全的,這就意味着你不須要使用諸如@synchronized 之類的來防止使用多個線程或者隊列時不一樣步的問題。

相關文章
相關標籤/搜索