dispatch_once
与仅需要一次初始化的属性使用运行时条件检查之间有什么区别
方法1:运行时检查
- (MyProp *)myProp{
if (!_myProp){
_myProp = [[MyProp alloc] init];
}
return _myProp;
}
方法2:使用dispatch_once
- (MyProp *)myProp{
dispatch_once_t once;
dispatch_once(&once, ^{
_myProp = [[MyProp alloc] init];
}
return _myProp;
}
我猜方法2在某种程度上更快但不太确定。
有人可以给我任何交易吗?
由于
答案 0 :(得分:1)
dispatch_once
是线程安全的。因此,如果两个线程同时第一次调用myProp
,dispatch_once
确保只有一个初始化变量。方法1可以将变量初始化两次,甚至可能破坏内存,使得引用无效。一旦属性初始化,这些行为就会相同。
方法2实际上比方法1略慢,特别是在第一次初始化期间。但在通常情况下(初始化后读取),性能非常关闭(可能相同)。如果您想更深入地探索它的工作原理和原因,请参阅Mike Ash的Secrets of dispatch_once。
请注意,您的方法2代码不正确。您已将once
设为自动本地变量。它必须是static
或dispatch_once
无法完成其工作。你的意思是:
- (MyProp *)myProp{
static dispatch_once_t once; // <--- this "static" is critical
dispatch_once(&once, ^{
_myProp = [[MyProp alloc] init];
}
return _myProp;
}