适当的单身人士实施

时间:2015-02-24 00:01:05

标签: objective-c singleton

我正在阅读一本试图刷掉Objective-C上的灰尘的书,我在阅读如何实现单例时遇到了这个问题。这是他们在书中所具有的实现:

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

return shared store

}

我的问题是,为什么每次运行该方法时都会将其设置为nil,然后检查它是否为零,现在显然是,并创建一个新实例?这听起来像是破坏了单身人士的整个目的,只有一个班级的一个实例。我注意到了很多与单例实现有关的问题,但没有一个与这方面有关。相信我,在发布之前我已经梳理过了。

1 个答案:

答案 0 :(得分:1)

静态变量仅在第一次设置为nil。实例化sharedClass实例后,每当您调用[ClassName sharedClass]时,您都将拥有相同的实例。

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

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

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

这可以防止可能发生的崩溃。