+(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 将在第一个线程完成时阻塞第二个线程。
您还可以将初始化放在 if (self == [Ship class])
的检查中,这样当任何子类调用其初始化方法时,它就不会 运行 多次。
在实际调用任何 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 将在第一个线程完成时阻塞第二个线程。
您还可以将初始化放在 if (self == [Ship class])
的检查中,这样当任何子类调用其初始化方法时,它就不会 运行 多次。