在实际调用任何init方法之前,我正在对静态变量进行一些初始化。这是代码:
+(void)initialize{
if(sShipsDefaults == nil){
//initialize static variable called sShipsDefaults
}
}
我可以看到,只有一次,懒惰地,在创建第一个类实例时调用初始化,这是期望的行为。
我检查sShipsDefaults的部分是nil是因为每个类调用一次初始化,每个子类也调用一次。因此,如果我有Ship类和EnemyShip类,它是Ship的子类,则初始化被调用两次(每次创建它的对象时每个类一次)。
现在让我们回到这个问题......初始化是否像dispatch_once_t一样执行锁定(它是否是线程安全的)?
答案 0 :(得分:2)
是的,如果在第一个线程所在的第二个线程中调用initialize,那么运行时将在第一个线程完成时阻塞第二个线程。
您还可以将初始化放在if (self == [Ship class])
的检查中,以便在任何子类调用其初始化方法时不会多次运行。