我遇到了一个奇怪的问题。我可以很好地访问我的类单例实例,但是如果我再次尝试访问它,它似乎挂起。这是代码的简单版本:

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

图片(差异类名):

重新启动 Xcode 或计算机没有帮助。

最佳答案

创建 MyManager 时,会使用锁来防止其他线程在创建变量时访问该变量。您无法从 init 方法中访问此变量。它似乎不仅挂起您的程序,而且每次都会挂起您的程序,因为您正在创建一个死锁。

解决方案:不要在 init 方法中使用该变量。不要直接或间接从 init 方法访问 _SharedInstance。

10-08 11:59