2014-11-20 62 views
0

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

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

回答

0

singletonInstance变量设置为nil,而是因为它有一个static范围(即它的行为就像一个全球性的,这只是在此方法中访问),它被设置为nil只有一次(不是每个这个方法被调用的时候)。因此,一旦将singletonInstance设置为该dispatch_once块内该类的特定实例,您可以放心,稍后将不会将该变量重置为nil

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

这里的常见线索是在变量声明中使用static关键字。 static限定符指定该变量不是对特定方法唯一的本地变量,也不是该类的特定实例唯一的实例变量。这是一个变量,在对此singletonInstance方法的所有调用中有效共享(或至少在应用程序终止之前)。因此,static变量是跟踪单例实例的有效机制,也是一个很好的参考,它可以用来跟踪它是否被调用。