+(void)初始化线程安全性

时间:2015-03-19 15:36:21

标签: ios objective-c initialization thread-safety grand-central-dispatch

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

+(void)initialize{

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

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

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

现在让我们回到这个问题......初始化是否像dispatch_once_t一样执行锁定(它是否是线程安全的)?

1 个答案:

答案 0 :(得分:2)

是的,如果在第一个线程所在的第二个线程中调用initialize,那么运行时将在第一个线程完成时阻塞第二个线程。

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

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

相关问题