2014-11-20 59 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變量是跟蹤單例實例的有效機制,也是一個很好的參考,它可以用來跟蹤它是否被調用。