2011-01-13 58 views
0

我經常看到單班設計類似以下內容:iPhone SDK:當分配一個靜態變量時,我應該檢查零嗎?

@implementation SomeImplementation 

static SomeClass *sharedSomeObject = nil; 

+ (void) someClassMethod { 
    sharedSomeObject = [[SomeImplementation alloc] init]; 
    // do something 
} 

@end 

someClassMethod可以在任何時候被調用 - 它應該被檢查零第一分配sharedSomeObject的新實例之前?或者,由於sharedSomeObject是靜態的,檢查是否不必要?看到這樣的代碼,我總是希望在分配周圍放置一個if(!sharedSomeObject)。

回答

3

是的,絕對!否則,每次調用方法時都會創建多個對象。這是我們做的事情:

+ (SomeClass *) shared { 
    static SomeClass *sSingleton; 

    if (! sSingleton) sSingleton = [SomeClass new]; 

    return sSingleton; 
} 

編輯

這個答案已經很老了,不是線程安全的,不再是一個合適的單身初始化方法。請參閱this Stackoverflow answer瞭解如何使用GCD處理現在的問題。

+0

請注意,函數靜態聲明是故意的。它有助於保持代碼清潔並僅將可見性降低到+共享方法。通過這樣做,您還可以在任何地方重複使用名稱「sSingleton」。沒有命名空間污染。 – par 2011-01-13 04:17:50

+0

我還會指出,如果以上代碼實現爲as-is,則每次調用someClassMethod時會泄漏先前的sharedSomeObject實例。確認! – par 2011-01-13 04:20:01

2

當談到在Objective-C中使用Singleton設計模式時,我強烈推薦使用Matt Galagher的「SynthesizeSingleton.h」宏。它處理所有與singelton有關的話題,如釋放(是一個合適的詞?)記憶,如果不再需要單身人士。

這裏的鏈接到「可可與愛」網站,其中包含關於這個主題的文章,以及爲紐帶的「SynthesizeSingleton.h」頭文件的下載:

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

你還將討論使用全局變量與使用Singleton設計模式的關係,以及關於在那裏使用Singleton的不同方法的一些考慮。

相關問題