2014-11-24 62 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