前言
這些天在研究利用Objective-C的runtime的method swizzling存捺,發(fā)現(xiàn)簡直是黑魔法啊,有興趣的同學(xué)可以看看顿痪,鏈接傳送門:http://nshipster.com/swift-objc-runtime/
看到里面使用dispatch_once來實(shí)現(xiàn)的單例碳蛋,保證線程安全老厌,我在這篇文章中也分享下我對Swift單例的理解與用法吧
單例的英文: Singleton
我所了解在Swift中有三種實(shí)現(xiàn)單例的方法,科學(xué)的在前面 :)
1. 類常量 Class Constant
在Swift1.2份殿,Swift2以上的童鞋們請自覺考慮這種方法
class Singleton {
static let sharedInstance: Singleton = Singleton()
}
這是一個(gè)會被整個(gè)當(dāng)前class所分享的常量膜钓,并且不會被subclass所override,let保證了這個(gè)是線程安全滴卿嘲。同時(shí)Swift在這里很機(jī)智的實(shí)現(xiàn)了懶加載颂斜,所以變得更加科學(xué)了。
不過注意Swift1.2以下是不支持拾枣,如果要考慮到向下兼容沃疮,請看繼續(xù)看下面的方法。
2. Nested結(jié)構(gòu)
class Singleton {
class var sharedInstance {
struct SharedStatic {
static let instance: Singleton = Singleton()
return SharedStatic.instance
}
}
}
這樣寫也很科學(xué)梅肤,雖然長了很多司蔬,至少是安全并且合理的。這里的class var就是靜態(tài)變量姨蝴,class func同理是靜態(tài)函數(shù)俊啼,就像是static function一樣的感覺。
3. GCD的dispatch_once
class Singleton {
class var sharedInstance {
struct SharedStatic {
static var token: dispatch_once_t = 0
static var instance: Singleton? = nil
}
dispatch_once(&SharedStatic.token) { SharedStatic.instance = Singleton() }
return SharedStatic.instance!
}
}
這是傳統(tǒng)Objective-C處理單例的寫法左医,熟悉GCD的童鞋應(yīng)該都了解過授帕,不知道為何在國內(nèi)很多文章中這種做法是被首推的,在我查閱了許多國內(nèi)外的文檔之后浮梢,基本確認(rèn)這種方法相對于上面兩種沒有任何優(yōu)勢跛十,除了看起來比較牛逼。