2012-08-25 64 views
1

我剛剛開始在Objective-C和我碰到這個例子來打造一個單身:澄清一個Objective-C的Singleton實例

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

     return sharedStore; 
} 

我明白了什麼是他想要做的事 - 這是如果它存在,則返回相同的實例,如果不存在,則創建一個新實例。讓我困擾的是這行:

static BNRItemStore *sharedStore = nil; 

這會不會行重置sharedStore到零值,每次調用該方法?我沒有看到的方法如何能夠返回先前存在的情況下,如果該行一直將其設爲零。

在此先感謝。

回答

4

這是Objective-C的從標準C.繼承的任何變量與靜態存儲持續時間(其static類型說明符顯式聲明)僅初始化一次一個元件,及the c standard說,這種情況發生在節目開始之前。

6.2.4 3)對象,其識別符被聲明與外部或內部的鍵,或者與存儲類說明靜態具有靜態存儲持續時間。其壽命是該程序的整個執行和其存儲的值被初始化僅僅一次,編程啓動之前。

注意,它也提到,如果與靜態存儲持續時間的變量是「指針類型」,那麼它會自動設置爲NULL指針(這是零是什麼),所以如果你願意,你可以省略聲明的= nil一部分,如果你認爲這會增加你函數的可讀性。

+0

謝謝各位的全面的答案。瞭解。 – Jops

1

每次調用該方法時,此行是否不會將sharedStore重置爲零值?

由於sharedStorestatic,它將被初始化(在= nil位)第一次被調用。隨後的呼叫將跳過這些說明。

我不明白該方法是否能夠返回先前存在的實例,如果此行始終將其設置爲零。

因爲它是static該方法退出後,變量及其值將保留在內存中。

基本上,你可以認爲這是一個全局變量,但它只能訪問+sharedStore

+0

謝謝回覆@Justin。感謝您的提示。 – Jops

+0

@Ronixus竭誠爲 – justin