低级单例实例

时间:2014-11-20 22:10:25

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

有人可以给出一个低级别的解释,说明为什么singletonInstance没有设置为nil,以及dispatch_one如何与onceToken一起使用?

+ (id)singletonInstance {
    static FOO *singletonInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singletonInstance = [[self alloc] init];
    });
    return singletonInstance;
}

1 个答案:

答案 0 :(得分:0)

singletonInstance变量 设置为nil,但因为它具有static范围(即它的行为类似于只能在此范围内访问的全局变量)方法),它只被设置为nil一次(不是每次调用此方法)。因此,一旦singletonInstancedispatch_once块内设置为此类的特定实例,您就可以放心,该变量以后不会重置为nil

dispatch_once调用只是确保代码块只调用一次(而static变量onceToken是如何跟踪它是否被调用的方式然而)。与其他方法相反,dispatch_once模式的好处在于它是线程安全的(因此即使多个线程同时尝试调用singletonInstance,它也只会被调用一次,避免竞争条件)。

这里的共同点是在变量声明中使用static关键字。 static限定符指定变量不是特定方法唯一的局部变量,也不是实例变量,对于类的特定实例是唯一的。它是在对此singletonInstance方法的所有调用中有效共享的变量(或者,至少在应用程序终止之前)。因此,static变量是跟踪单例实例的有效机制,也是dispatch_once可用于跟踪是否已被调用的良好引用。