正确的单例实现

Proper Singleton Implementation

我正在通读一本书,试图清除 Objective-C 的灰尘,我在阅读如何实现单例时 运行 进入了这个问题。这是他们在书中的实现:

+ (ClassName *)sharedClass {
static ClassName *sharedClass = nil;
if (!sharedClass) {
sharedClass = [[super allocWithZone:nil] init];

return shared store

}

我的问题是,为什么每次方法 运行 时他们都将其设置为 nil,然后检查它是否为 nil(现在显然是 nil)并创建一个新实例?这听起来好像违背了单身人士的全部目的,只有一个 class 实例。我注意到有很多与单例实现相关的问题,但 none 具体到它的这方面。相信我,发帖前我已经梳理过了。

静态变量第一次设置为nil。一旦 sharedClass 实例被实例化,每当您调用 [ClassName sharedClass].

时,您将始终拥有相同的实例

你应该使用线程安全模式来使用单例模式。

+ (instancetype)shared {
    static id shared = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[self alloc] init];
    });
    return sharedInstance;
}

这将防止可能的崩溃。