Swift單例模式

Swift單例模式

單例模式

單例模式的作用是解決“應(yīng)用中只有一個實例”的一類問題。在Cocoa Touch框架中果复,有UIApplication陈莽、NSUserDefaults和NSNotificationCenter等單例類。另外,NSFileManager和NSBundle類雖然屬于Cocoa框架的內(nèi)容传透,但也可以在Cocoa Touch框架中使用(Cocoa框架中的單例類有NSFileManager耘沼、NSWorkspace和NSApplication等)。

很多人都熟悉OC的單例創(chuàng)建的方式,使用NSLock朱盐、@synchronized等鎖群嗤,所用GCD的dispatch-once創(chuàng)建等..
但是Swift作為一個新的語言,跟OC的區(qū)別還是蠻大的兵琳,
那么怎么私用Swift創(chuàng)建一個單例呢狂秘?

單例模式的實現(xiàn)有很多方案,蘋果公司在《UsingSwift with Cocoa and Objective-C》官方文檔中給出了一種單例模式的實現(xiàn)躯肌。最簡單形式代碼如下:

    class Singleton {  
        static let sharedInstance = Singleton()  
    }  

是的就是這么簡單,上述代碼采用static的類屬性實現(xiàn)單例模式者春,這種類屬性只被延遲加載執(zhí)行一次,即便是在多線程情況下也只是執(zhí)行一次清女,并且保證是線程安全的钱烟。
當(dāng)然這里使用了全局變量而非類變量,是因為不支持類變量

與類不同嫡丙,結(jié)構(gòu)可以定義靜態(tài)變量拴袭,通過使用此方法,將靜態(tài)變量升級為類變量(在支持類變量之前曙博,推薦此方法)

class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }
}

如果我們想要有更多的初始化,我么也可以使用閉包的形式創(chuàng)建

    class Singleton {  
        static let sharedInstance: Singleton = {  
              let instance = Singleton()  
              // 初始化處理  
              return instance  
            }()  
    }  

當(dāng)然很多人會想到dispatch-once,因為OC這樣的創(chuàng)建方式已經(jīng)習(xí)慣了,

class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : Singleton? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        return Static.instance!
    }
}

但是Swift3.0取消了once的實現(xiàn),
所以我們只能自己來實現(xiàn).

extension DispatchQueue {
    private static var _onceTracker = [String]()
    public class func once(_ token: String, block:()->Void) {
        objc_sync_enter(self)
        defer { objc_sync_exit(self) }
        
        if _onceTracker.contains(token) {
            return
        }
        _onceTracker.append(token)
        block()
    }
}

那么我們創(chuàng)建的方式一樣可以使用once

class Singleton {
        class var sharedInstance : Singleton {
            struct Static {
                static var onceToken = NSUUID().uuidString//可以自定一個值......
                static var instance : Singleton? = nil
            }
            DispatchQueue.once(Static.onceToken) {
                Static.instance = Singleton()
            }
            return Static.instance!
        }
    }

當(dāng)然單例模式的創(chuàng)建,我只是列舉了幾個例子,至于在應(yīng)用中如何使用,使用哪一個,可以根據(jù)需求來定....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拥刻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子父泳,更是在濱河造成了極大的恐慌般哼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惠窄,死亡現(xiàn)場離奇詭異蒸眠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杆融,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門楞卡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人擒贸,你說我怎么就攤上這事臀晃。” “怎么了介劫?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵徽惋,是天一觀的道長。 經(jīng)常有香客問我座韵,道長险绘,這世上最難降的妖魔是什么踢京? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宦棺,結(jié)果婚禮上瓣距,老公的妹妹穿的比我還像新娘。我一直安慰自己代咸,他們只是感情好蹈丸,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呐芥,像睡著了一般逻杖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上思瘟,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天荸百,我揣著相機(jī)與錄音,去河邊找鬼滨攻。 笑死够话,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的光绕。 我是一名探鬼主播女嘲,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奇钞!你這毒婦竟也來了澡为?” 一聲冷哼從身側(cè)響起漂坏,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤景埃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后顶别,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谷徙,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年驯绎,在試婚紗的時候發(fā)現(xiàn)自己被綠了完慧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡剩失,死狀恐怖屈尼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拴孤,我是刑警寧澤脾歧,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站演熟,受9級特大地震影響鞭执,放射性物質(zhì)發(fā)生泄漏司顿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一兄纺、第九天 我趴在偏房一處隱蔽的房頂上張望大溜。 院中可真熱鬧,春花似錦估脆、人聲如沸钦奋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锨苏。三九已至,卻和暖如春棺聊,著一層夾襖步出監(jiān)牢的瞬間伞租,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工限佩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留葵诈,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓祟同,卻偏偏與公主長得像作喘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晕城,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • 單例模式需要滿足 整個程序的生命周期只能存在一個泞坦,所以 構(gòu)造器需要是private, 保證外部無法調(diào)用構(gòu)造器 線程...
    JaiUnChat閱讀 422評論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫砖顷、插件贰锁、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,098評論 4 62
  • iOS開發(fā)中過程中最熟悉的設(shè)計模式應(yīng)該是單例模式,例如NotificationCenter通知中心滤蝠、Applica...
    FlyElephant閱讀 398評論 0 0
  • 就在前幾天豌熄,朋友圈里紛紛擾擾地轟炸『2015過去了,2016要好好的』物咳、『新年快樂锣险,一定要加油』等等。 看到這些言...
    SwingWong閱讀 268評論 0 0
  • 曾經(jīng)有一段時間览闰,我很羨慕那些寫作大神芯肤,他們怎么那么多東西可以寫,他們怎么可以懂那么多東西压鉴。 直到來到簡書崖咨,看了幾篇...
    西橙L閱讀 100評論 0 0