iOS--Swift開發中的單例設計模式

來源:互聯網
上載者:User

iOS--Swift開發中的單例設計模式
最近在開發一個小的應用,遇到了一些Objective-c上面常用的單例模式,但是swift上面還是有一定區別的,反覆倒來倒去發現不能按常理(正常的oc to swift的方式)出牌,因此搜尋了一些文章。可能是xcode或者sdk的問題吧(我相信他們不會把未經測試的代碼展示,吧?。。。),一些文章中的代碼犯了明顯的錯誤,編譯失敗。於是有了這篇文章,分享給大家。   原作者實現了一種單例,但是紅色代碼導致非安全執行緒:  1 class var sharedInstance:TPScopeManager { 2     get { 3         struct Static { 4             static var instance : TPScopeManager? = nil 5         } 6  7         if !Static.instance { 8             Static.instance = TPScopeManager() 9         }10 11         return Static.instance!12     }13 }於是有了下面這些解決方案(個人感覺很精彩): 全域常量 第一種:直接聲明全域變數 let _SingletonSharedInstance = Singleton() class Singleton  {    ...}優點:代碼最簡潔。 缺點:代碼開放度較亂   第二種就彌補了上面的缺點 private let _SingletonSharedInstance = Singleton() class Singleton  {    class var sharedInstance : Singleton {        return _SingletonSharedInstance    }}註:因為不支援類型常量(即類的靜態常量),所以這裡使用了全域常量 這種方式支援延遲(lasy)初始化,因為Swift會延遲初始化全域常量(和變數),並且let關鍵字是安全執行緒的。(言外之意:全域變數也是延遲初始化的,但非安全執行緒我表示不確定,請大神賜教) Nested struct(估且譯為內部struct吧) class Singleton {    class var sharedInstance : Singleton {        struct Static {            static let instance : Singleton = Singleton()        }        return Static.instance    }}類不支援類型常量(即類的靜態常量),但struct支援。利用此,可以達到類似的效果。 原著建議使用內部struct的方式,除非新版本中支援了類型變數 dispatch_once(這個真不能翻譯) 傳統的OC方式在Swift中也是支援的,對比上一種方式,這種方式很明顯沒有任何優勢,但是還是寫出來吧 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!    }}(原理一樣,還是用struct支援類型變數這一優勢,來把OC的dispatch_once方式平移過來,參考:http://www.codes51.com/article/detail_111374.html) 如上所述,蘋果官方已經明確聲明延遲初始化是安全執行緒的,所以,沒有必要再加一層dispatch_once或者類似的保護措施。 全域變數(struct和enum內部的靜態成員也同樣)的消極式載入本質是dispatch_once,因此如果想使用dispatch_once,不如直接聲明一個私人全域變數,即保證了安全執行緒,也不會使代碼過於open

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.