dispatch_once vs runtime检查一次初始化属性

时间:2017-02-28 11:28:33

标签: objective-c initialization grand-central-dispatch

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在某种程度上更快但不太确定。

有人可以给我任何交易吗?

由于

1 个答案:

答案 0 :(得分:1)

dispatch_once是线程安全的。因此,如果两个线程同时第一次调用myPropdispatch_once确保只有一个初始化变量。方法1可以将变量初始化两次,甚至可能破坏内存,使得引用无效。一旦属性初始化,这些行为就会相同。

方法2实际上比方法1略慢,特别是在第一次初始化期间。但在通常情况下(初始化后读取),性能非常关闭(可能相同)。如果您想更深入地探索它的工作原理和原因,请参阅Mike Ash的Secrets of dispatch_once

请注意,您的方法2代码不正确。您已将once设为自动本地变量。它必须是staticdispatch_once无法完成其工作。你的意思是:

- (MyProp *)myProp{
  static dispatch_once_t once; // <--- this "static" is critical
  dispatch_once(&once, ^{
    _myProp = [[MyProp alloc] init];
  }
  return _myProp;
}