当我使用静态来实现单例时,有什么可能出错吗?

2 singleton objective-c

我正在实现一个单例类(如果这是错误的话,不要进入讨论).我有一个方法来获取这个类的实例,它被懒惰地初始化:

+ (FFDataManager *)sharedDataManager {
  static FFDataManager *dm = nil;
  if (!dm) {
    dm = [[FFDataManager alloc] init];
  }

  return dm;
}
Run Code Online (Sandbox Code Playgroud)

使用static(在方法内部)而不是创建全局变量时,我应该注意什么?有什么可能出错的,互联网上的所有教程都使用全局变量.

Jor*_*ers 6

我首选的单例实现如下:

+ (MyClass *) sharedInstance {
    static dispatch_once_t predicate = 0;
    __strong static MyClass *shared = nil;

    dispatch_once(&predicate, ^{
        shared = [[self alloc] init];
    });

    return shared;
}
Run Code Online (Sandbox Code Playgroud)

使用dispatch_once确保这也是线程安全的.当多个线程同时访问时,您的代码将分配两次.