2015-07-10 77 views
-2

我一直在尋找解決方案,如何創建一個單線程模式是線程安全的IOS。 我一遍又一遍地找到了相同的解決方案,但是當我初始化對象時指針仍然爲空。正如你從截圖中可以看出的那樣。Singleton(sharedInstance)無推薦初始化後

這很奇怪,因爲互聯網上沒有人似乎有這個問題到目前爲止。我自己需要比較一下,如果sharedInstance被初始化爲在其他地方輸入某段代碼,它會在初始化後告訴我它爲零。

這是怎麼回事?任何人都有線索嗎? 我想了解! :d

由於提前, 歡呼聲, 雷神

//爲什麼這不是一個重複:// 這個問題是不是正確的初始化它是關於爲什麼sharedInstance沒有表現得像它應該在之後。我仍然遇到無法將它與nil比較的問題,甚至在sharedInstance方法中有一個比較,以防止覆蓋單例。如何防止覆蓋會是我的後續問題?我甚至用init中設置的另一個BOOL嘗試了它。結果是,if(!bool)將被視爲true,儘管我的調試器說bool == yes->!bool應該是false。

問題:爲什麼我的指針實例正確地返回並在外部(在調用方方)結果爲零? 要清楚從外面打電話:

ControlSchemes *cs = [ControlSchemes sharedInstance]; 

將根據調試器進入sharedInstance的代碼有一個有效的指針在返回一個有效的對象,但屆時將有CS裏面零加入後。爲什麼?

//

enter image description here

回答

1

除積的答案,給出了推薦的方法來創建一個單身,這裏就是爲什麼你有一個完整的故障:

要調用[超級allocWithZone。你正在用類方法調用它。在類方法中,self是一個類。不是一個實例,而是一個類。因此super不是你的類的超類(比如ControlSchemes的超類),而是Class的超類。但班級沒有超班。它的超類是零。所以你把allocWithZone發送到零,然後返回零。

即使你叫頁頭爲ControlSchemes的超類,這將是明顯的廢話,因爲你不想要的父類的實例,但ControlSchemes的一個實例。

+0

謝謝.. 。這是一個很好的提示......但正如Jaegers看到的那樣(第一個屏幕截圖[self alloc]),我仍然可以得到指向return語句的指針,但在調用方法中返回的指針爲零。這方面的任何線索? – Thor

3

您應該創建單身這種方式。

+ (instancetype)sharedInstance 
{ 
    static dispatch_once_t once; 
    static id sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 
0

好了在我用Jaegers做出的調整後,我發現我在第一個屏幕截圖中看到了第二個變量。

所以我認爲:

我的第一個執行問題( - >見截圖2)由gnasher729回答。

與第二的實施與調整從積問題( - >見截圖1)是sharedInstance的簡單雙初始化(出退回IFS範圍)

謝謝你們