2015-02-24 81 views
-1

我正在閱讀一本試圖刷掉Objective-C灰塵的書,並且在閱讀如何實現單例時遇到了這個問題。這是執行,因爲他們有它的書:正確的單例執行

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

return shared store 

} 

我的問題是,他們爲什麼會設置爲每次方法是跑爲零,然後檢查它是否是零,它現在顯然,和創建一個新的實例?這聽起來像是打敗了單身人士的整個目的,只有一個班級的實例。我注意到有很多與單例實現相關的問題,但沒有涉及這方面的具體問題。相信我,我在發佈前仔細閱讀。

+0

更好地讀取函數中的靜態變量。 – zaph 2015-02-24 00:03:52

+1

由於var聲明爲靜態,所以將其視爲文件級別的變量。 = nil只在最初運行。無論如何,這裏有一個非常好的單身解決方案http://stackoverflow.com/questions/7568935/how-do-i-implement-an-objective-c-singleton-that-is-compatible-with-arc – danh 2015-02-24 00:04:09

+0

@Zaph Do當你將它們設置爲零時,它們不會設置爲零? – John 2015-02-24 00:34:05

回答

1

靜態變量僅在第一次被設置爲零。一旦sharedClass實例被實例化,每當你調用[ClassName sharedClass]時,你總會有相同的實例。

您應該使用線程安全模式來使用單例模式。

+ (instancetype)shared { 
    static id shared = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     shared = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

這將防止可能的崩潰。

+1

想知道爲什麼倒票。 – zaph 2015-02-24 01:33:35