1

查看代码块,它是一个类方法。谁能给我一些关于这种方法的解释?它做了什么?

+ (PeriodicElements *)sharedPeriodicElements {
  @synchronized(self) {
    static dispatch_once_t pred;
    dispatch_once(&pred, ^{ sharedPeriodicElementsInstance = [[self alloc] init]; });
  }
  return sharedPeriodicElementsInstance;
}
4

1 回答 1

3

它用于创建单例。dispatch_once将确保无论您调用多少次sharedPeriodicElements,初始化程序在您的应用程序的整个生命周期内只会被调用一次。

synchronized块有点过头了,因为dispatch_once它已经是线程安全的。似乎您正在查看旧的单例方式的部分变异版本:

+ (PeriodicElements *)sharedInstance {
    static PeriodicElements *sharedPeriodicElementsInstance;
    @synchronized(self) {
        if (sharedPeriodicElementsInstance == nil) {
            sharedPeriodicElementsInstance = [[PeriodicElements alloc] init];
        }
    }
    return sharedPeriodicElementsInstance;
}

要清楚(谢谢@bbum),这确实是您应该运行的:

+(PeriodicElements *)sharedPeriodicElements {
    static dispatch_once_t pred;
    dispatch_once(&pred, ^{ sharedPeriodicElementsInstance = [[self alloc] init]; });
    return sharedPeriodicElementsInstance;
}
于 2013-04-15T13:16:21.783 回答