你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS--Swift開發中的單例設計模式

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

編輯:IOS開發綜合
最近在開發一個小的應用,遇到了一些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
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved