2010-03-09 49 views
0

沒有人有任何的偏好或意見有關使用要麼...Singleton:在哪裏創建實例?

static id sharedReactor = nil; 

+(id)sharedInstance { 
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init]; 
return sharedReactor; 
} 

OR:

static id sharedReactor = nil; 

+(void)initialize { 
if(sharedRandomReactor == nil) { 
sharedRandomReactor = [[super allocWithZone:NULL] init]; 
} 

+(id) sharedInstance { 
    return sharedReactor; 
} 

要使用+(無效),我的腦海裏似乎初始化了很多更優雅,我只是好奇有什麼比我有更多經驗的人會想到這兩種方法?

加里

+0

在這個假設中,什麼叫'initialize'? – 2010-03-09 18:29:37

+0

顯然...「運行時發送初始化給程序中的每個類,恰好在類或從它繼承的任何類之前,從程序中發送它的第一條消息(因此可能永遠不會調用該方法)運行時以線程安全的方式將初始化消息發送給類。超類在它們的子類之前接收到這個消息。「 – fuzzygoat 2010-03-09 18:50:32

+0

但是:我剛剛從bbum中發現了一個博客條目,重新說明了如果一個子類沒有實現它,但是superClass可以執行多次初始化的可能性。鑑於這個新證據,我將採用第一種方法。 – fuzzygoat 2010-03-09 18:54:10

回答

0

我剛剛從bbum發現了一個博客條目,如果一個子類沒有實現它,但是超類有,可以重新執行+初始化的可能性不止一次。只要你牢記這個弱點+(無效)初始化可能是最好的選擇,特殊的地方,你需要線程安全,你不想採用@synchronized命中。在說過,如果你只是尋找簡單的單例作爲共享數據模型使用,而不是擔心線程安全問題,那就去找第一個。

0

我喜歡+(id)instance和方法本身內的局部靜態的。 (更像第一個例子)

0

第一個選項的問題是,您現在有一個更多的責任,即調用「Initialize」=>更多可能的錯誤。

但是,第二個優點是,在初始化實例一後,代碼不再檢查它是否爲零,因此它可以節省您很少的CPU週期。

雖然,我與第一個去..

+1

運行時系統首次將類加載到內存後立即調用+ initialize方法。你的代碼不應該直接調用這個方法。 – jlehr 2010-03-09 22:01:03

2

Mike Ash's site這裏是使用大中央調度的另一種方式:

+ (id)sharedWhatever 
{ 
    static dispatch_once_t pred; 
    static Whatever *whatever = nil; 
    dispatch_once(&pred, ^{ 
     whatever = [[Whatever alloc] init]; 
    }); 
    return whatever; 
} 
+0

但iPhone OS上存在libdispatch嗎? (見標籤) – 2010-03-09 20:13:45

0

這是要走的路...

static id sharedReactor = nil; 

+(id)sharedInstance { 
if(sharedReactor == nil) sharedReactor = [[super allocWithZone:NULL] init]; 
return sharedReactor; 
} 

這兩種方法更清晰。

+0

爲什麼不只是[[self alloc] init]而不是[[super allocWithZone:nil] init]? – jlehr 2010-03-09 22:02:53

+0

另外,爲什麼在+ sharedInstance方法的範圍之外暴露靜態變量? – jlehr 2010-03-09 22:10:05

+0

靜態變量只需分配一次。 – Jordan 2010-03-09 23:39:20

0

我一直按照Cocoa Fundamentals guide from Apple的建議。通過這種方式,無論該類是多次實例化還是通過sharedInstance類方法訪問,返回的對象始終都是相同的。

該指南還強調重新定義保留/釋放,以防止其資源被回收。只是FYI。