麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

iOS——Swift開發中的單例設計模式(摘譯,非原創)

2019-11-14 19:34:20
字體:
來源:轉載
供稿:網友

最近在開發一個小的應用,遇到了一些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方式平移過來)

如上所述,蘋果官方已經明確聲明延遲初始化是線程安全的,所以,沒有必要再加一層dispatch_once或者類似的保護措施。

全局變量(struct和enum內部的靜態成員也同樣)的延遲加載本質是dispatch_once,因此如果想使用dispatch_once,不如直接聲明一個私有全局變量,即保證了線程安全,也不會使代碼過于open

我比較喜歡全局變量方式(當然是經過優化的那種),不用嵌套一層struct,比較簡潔。大家喜歡哪種呢?

 

英語好的可以直接看原帖 http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久日韩在线 | 91av在线影院 | 色播久久| 日本一区二区久久久 | 亚洲综合精品 | 精品国产一区二区三区四区在线 | 国产羞羞视频在线观看免费应用 | 成人福利软件 | 亚洲一区二区免费 | 国产精品一品二区三区四区18 | 国产精品视频久久久 | 久久亚洲春色中文字幕久久 | 视频国产一区二区 | 国产精品一区99 | 国产精品午夜小视频观看 | 黄色av网站在线观看 | 久久精品女人天堂av | 亚洲一区二区三区精品在线观看 | 中午字幕无线码一区2020 | 色淫视频 | 亚洲第五色综合网 | 久久国产精品二国产精品 | 性猛交ⅹxxx乱巴西 在线播放中文 | 黄色免费在线电影 | 成人午夜视频在线观看 | 91九色精品| 黄色片免费在线 | www.国产一区.com| 久久精品视频日本 | 精品亚洲va在线va天堂资源站 | 黄色片视频在线观看 | 欧美性受xxxxxx黑人xyx性爽 | 国产精品久久久久久久四虎电影 | av免费在线网 | 色诱亚洲精品久久久久久 | 精品国产乱码久久久久久久 | 成年免费大片黄在线观看岛国 | 操你视频| 久久久久女人精品毛片九一 | 成人在线视频精品 | 国产高潮好爽受不了了夜色 |