有人可以给出一个低级别的解释,说明为什么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;
}
答案 0 :(得分:0)
singletonInstance
变量 设置为nil
,但因为它具有static
范围(即它的行为类似于只能在此范围内访问的全局变量)方法),它只被设置为nil
一次(不是每次调用此方法)。因此,一旦singletonInstance
在dispatch_once
块内设置为此类的特定实例,您就可以放心,该变量以后不会重置为nil
。
dispatch_once
调用只是确保代码块只调用一次(而static
变量onceToken
是如何跟踪它是否被调用的方式然而)。与其他方法相反,dispatch_once
模式的好处在于它是线程安全的(因此即使多个线程同时尝试调用singletonInstance
,它也只会被调用一次,避免竞争条件)。
这里的共同点是在变量声明中使用static
关键字。 static
限定符指定变量不是特定方法唯一的局部变量,也不是实例变量,对于类的特定实例是唯一的。它是在对此singletonInstance
方法的所有调用中有效共享的变量(或者,至少在应用程序终止之前)。因此,static
变量是跟踪单例实例的有效机制,也是dispatch_once
可用于跟踪是否已被调用的良好引用。