單例 :通常應用在 網絡工具、音頻工具安全
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 之類的來防止使用多個線程或者隊列時不一樣步的問題。