iOS陷入实例化依赖性而不会失败

时间:2016-09-04 01:38:10

标签: swift instantiation static-variables

如果我有一些看起来像

的东西
class Foo {
  static shared = Foo()
  init() {
    print("init Foo")
    let _ = Bar.shared
  }
}

class Bar {
  static shared = Bar()
  init() {
    print("init Bar")
    let _ = Foo.shared
  }
}

// somwehere else:
let _ = Foo.shared

然后应用程序卡住了。什么都没发生。我知道这个设计是错误的,但我想知道为什么应用程序没有崩溃,报告错误或至少打印循环。上面的代码打印

init Foo
init Bar

就是这样,表明它没有循环而只是卡住了。关于发生了什么的想法?

1 个答案:

答案 0 :(得分:3)

在Swift中,静态类型属性以保证线程安全的方式懒惰地初始化。

Type Properties

中的注释
  

存储类型属性在首次访问时会被懒惰地初始化。   它们只保证初始化一次,即使访问时也是如此   多个线程同时进行,不需要标记   使用惰性修饰符。

只有一次功能使用dispatch_once - 类似于需要互斥的东西(或其本身)。

初始化Foo.shared时,Foo.shared的锁被锁定。当它被锁定时,Bar.shared需要初始化,因此Bar.shared的锁被锁定。虽然两者都被锁定,Foo.shared需要初始化,但是它的锁定已经被锁定,所以请等待锁定被释放...

我们称这种情况为死锁