2014-11-24 70 views
4

我遇到了一個奇怪的問題。我可以訪問我的類單例實例,但如果我嘗試再次訪問它,它似乎掛起。下面是代碼的簡單版本:當使用Swift訪問類單例時使用semaphore_wait_trap

private let _SharedInstance = MyManager() 

class MyManager: NSObject { 

    class var sharedInstance: MyManager { 
     return _SharedInstance 
    } 

    override init() { 
     super.init() 

     println("init") 

     println(self.accessToken()) 
     println(MyManager) 
     println("test 1") 
     println(MyManager.sharedInstance) 
     println("test 2") 
    } 

} 

在這種情況下,它是從自身的init中調用它,但它在其他地方發生。

代碼永遠不會到test 2。只要它訪問MyManager.sharedInstance它掛起。沒有錯誤或警告。

如果我暫停調試器,我可以看到它目前有上semaphore_wait_trap

圖片(差類名):

Stack trace

重新啓動的Xcode或計算機並沒有幫助。

+2

它是死鎖。 – 2014-11-24 00:11:33

回答

8

當MyManager被創建時,使用鎖來阻止其他線程在創建時訪問該變量。你不能從init方法中訪問這個變量。它不只是似乎掛起你的程序,它會每一次掛起你的程序,因爲你正在創建一個死鎖。

解決方案:不要在init方法中使用該變量。不要直接或間接從init方法訪問_SharedInstance。

+0

謝謝!我試圖變得聰明並在'init'中設置所有的設置邏輯,但它最終試圖再次訪問'sharedInstance'。 – rdougan 2014-11-24 10:14:54