前言
這些天在研究利用Objective-C的runtime的method swizzling,發(fā)現(xiàn)簡直是黑魔法啊,有興趣的同學(xué)可以看看,鏈接傳送門:http://nshipster.com/swift-objc-runtime/
看到里面使用dispatch_once來實現(xiàn)的單例,保證線程安全,我在這篇文章中也分享下我對Swift單例的理解與用法吧
單例的英文: Singleton
我所了解在Swift中有三種實現(xiàn)單例的方法,科學(xué)的在前面 :)
1. 類常量 Class Constant
在Swift1.2,Swift2以上的童鞋們請自覺考慮這種方法
class Singleton {
static let sharedInstance: Singleton = Singleton()
}
這是一個會被整個當(dāng)前class所分享的常量,并且不會被subclass所override,let保證了這個是線程安全滴。同時Swift在這里很機智的實現(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)勢,除了看起來比較牛逼。