2015-11-15 149 views
-1

我有一個用於存儲其他類的實例對象的類。這個類有以下類方法被稱爲每當我需要得到的類本身(和存儲其他類的實例,其方法是對數據結構進行操作的數據結構):Objective C中的靜態初始化C

+ (instancetype)sharedStore 
{ 
static BNRItemStore *sharedStore = nil; 

//Do I need to create a sharedStore? 
if (!sharedStore) { 
    sharedStore = [[self alloc] initPrivate]; 
} 

return sharedStore; 
} 

static BNRItemStore *sharedStore = nil;行對我來說非常混亂。第一次調用類方法時,我們聲明static BNRItemStore *sharedStore並將其設置爲nil。我不明白爲什麼如果我們第二次調用該方法,sharedStore不會被覆蓋和/或釋放。顯然,這種情況從未發生過,所有後續調用+ (instancetype)sharedStore()方法似乎都完全忽略了static BNRItemStore *sharedStore = nil;這一行。這是爲什麼?

+1

這是因爲四十年的靜態變量規則。初始化發生_once_。 – gnasher729

回答

2

靜態

最後,一個大家的肯定承認:靜態的。

作爲一個關鍵字,靜態被用於很多不同的,不兼容的方式,所以在每個實例中確切地說明它的含義可能會令人困惑。說到存儲類,靜態意味着兩件事之一。

方法或函數內的靜態變量在調用之間保留其值。 全局聲明的靜態變量可以通過任何函數或方法調用,只要這些函數與靜態變量在同一個文件中出現。靜態功能也是如此。 Static Singletons

Objective-C中的常見模式是靜態單例,其中靜態聲明的變量被初始化並返回到函數或類方法中。調度一旦被用來保證變量在一個線程安全的方式初始化恰好一次:

+ (instancetype)sharedInstance { 
    static id _sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _sharedInstance = [[self alloc] init]; 
    }); 

    return _sharedInstance; 
} 

單元素模式是用於創建在跨越整個應用程序共享對象,諸如HTTP客戶端或一個有用通知管理器,或者可能造價昂貴的對象,例如格式化程序。

來源:http://nshipster.com/c-storage-classes/

0

Objective C沒有實現類實例變量。靜態聲明使sharedStore永久保留,但限制了它的訪問(與在類之外聲明它相比)。所以只有一個sharedStore,它只被初始化一次。後續調用該方法只需訪問sharedStore,它們不會創建新版本(也不會重新初始化它)。