Swift單例實現(xiàn)與經(jīng)驗分享

前言

這些天在研究利用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)勢,除了看起來比較牛逼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 從頭到尾的真相沒辦法說出來,總是受到所有人的質(zhì)疑卻無法解釋或不想解釋,也許我真是這樣的人,從不反抗,但請別讓我爆發(fā)
    一秋而冬閱讀 163評論 0 0
  • 導(dǎo)語:“墻里開花墻外香”這是現(xiàn)如今游戲出海的真實寫照,根據(jù)Newzoo的統(tǒng)計,中國2017年截止到4月底的游戲收入...
    報表哥閱讀 362評論 0 1