+(void) 初始化线程安全

+(void)initialize thread safety

在实际调用任何 init 方法之前,我正在对静态变量进行一些初始化。这是代码:

+(void)initialize{

    if(sShipsDefaults == nil){
        //initialize static variable called sShipsDefaults
    }
}

我看到的是,在创建 class 的第一个实例时,只懒惰地调用了一次初始化,这是期望的行为。

我检查 sShipsDefaults 为 nil 的部分是因为即使初始化每个 class 调用一次,它也每个子 class 调用一次。因此,如果我有 Ship class 和 EnemyShip class 其中 subclass Ship,则初始化被调用两次(每个 class 在第一次创建它的对象时)。

现在让我们回到问题...初始化是否像dispatch_once_t那样做锁(它是线程安全的)吗?

是的,如果在第一个线程在其中时从第二个线程调用初始化,那么 运行time 将在第一个线程完成时阻塞第二个线程。

参见:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

您还可以将初始化放在 if (self == [Ship class]) 的检查中,这样当任何子类调用其初始化方法时,它就不会 运行 多次。