swift單例

  • 1.單例是一個在 Cocoa 中很常用的模式了。對于一些希望能在全局方便訪問的實例帜平,或者在 app 的生命周期中只應(yīng)該存在一個的對象橘霎,我們一般都會使用單例來存儲和訪問腌且。在 Objective-C 中單例的公認的寫法類似下面這樣:

    @implementation TestViewController
    + (id)sharedManager {
          static TestViewController *staticInstance = nil;
          static dispatch_once_t onceToken;
    
          dispatch_once(&onceToken, ^{
              staticInstance = [[self alloc] init];
           });
          return staticInstance;
    }
    @end
    

使用 GCD 中的 dispatch_once_t 可以保證里面的代碼只被調(diào)用一次,以此保證單例在線程上的安全。

  • 2.因為在 Swift 中可以無縫直接使用 GCD航背,所以我們可以很方便地把類似方式的單例用 Swift 進行改寫:

    class TestViewController: UIViewController {
      class var sharedManager : TestViewController {
        struct Static {
          static var onceToken : dispatch_once_t = 0
          static var staticInstance : TestViewController? = nil
        }
    
        dispatch_once(&Static.onceToken) {
          Static.staticInstance = TestViewController()
        }
    
        return Static.staticInstance!
      }
    }
    
  • 3.因為 Swift 1.2 之前并不支持存儲類型的類屬性喉悴,所以我們需要使用一個 struct 來存儲類型變量。
    這樣的寫法當然沒什么問題玖媚,但是在 Swift 里我們其實有一個更簡單的保證線程安全的方式箕肃,那就是 let。把上面的寫法簡化一下今魔,可以變成:

    class TestViewController: UIViewController {
       class var sharedManager : TestViewController {
           struct Static {
              static let sharedInstance : TestViewController = TestViewController()
           }
    
           return Static.sharedInstance
        }
     }
    
    1. 還有另一種更受大家歡迎突雪,并被認為是 Swift 1.2 之前的最佳實踐的做法。由于 Swift 1.2 之前 class 不支持存儲式的 property涡贱,我們想要使用一個只存在一份的屬性時咏删,就只能將其定義在全局的 scope 中。值得慶幸的是问词,在 Swift 中是有訪問級別的控制的督函,我們可以在變量定義前面加上 private 關(guān)鍵字,使這個變量只在當前文件中可以被訪問激挪。這樣我們就可以寫出一個沒有嵌套的辰狡,語法上也更簡單好看的單例了:
private let sharedInstance = TestViewController()
  class TestViewController: UIViewController  {
      class var sharedManager : TestViewController {
          return sharedInstance
      }
  }
    1. swift3.0以后我們普遍使用“果沒有特別的需求,我們推薦使用下面這樣的方式來寫一個單例:
  class TestViewController: UIViewController  {
     private static let sharedInstance = TestViewController()
     class var sharedManager : TestViewController {
          return sharedInstance
      }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垄分,一起剝皮案震驚了整個濱河市宛篇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薄湿,老刑警劉巖叫倍,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豺瘤,居然都是意外死亡吆倦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門坐求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚕泽,“玉大人,你說我怎么就攤上這事桥嗤⌒肫蓿” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵泛领,是天一觀的道長荒吏。 經(jīng)常有香客問我,道長师逸,這世上最難降的妖魔是什么司倚? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任豆混,我火速辦了婚禮,結(jié)果婚禮上动知,老公的妹妹穿的比我還像新娘皿伺。我一直安慰自己,他們只是感情好盒粮,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布鸵鸥。 她就那樣靜靜地躺著,像睡著了一般丹皱。 火紅的嫁衣襯著肌膚如雪妒穴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天摊崭,我揣著相機與錄音讼油,去河邊找鬼。 笑死呢簸,一個胖子當著我的面吹牛矮台,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播根时,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瘦赫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛤迎?” 一聲冷哼從身側(cè)響起确虱,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎替裆,沒想到半個月后校辩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡扎唾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年召川,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胸遇。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汉形,靈堂內(nèi)的尸體忽然破棺而出纸镊,到底是詐尸還是另有隱情,我是刑警寧澤概疆,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布逗威,位于F島的核電站,受9級特大地震影響岔冀,放射性物質(zhì)發(fā)生泄漏凯旭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罐呼。 院中可真熱鬧鞠柄,春花似錦、人聲如沸嫉柴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽计螺。三九已至夯尽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間登馒,已是汗流浹背匙握。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陈轿,地道東北人肺孤。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像济欢,于是被迫代替她去往敵國和親赠堵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351