2009-09-21 32 views
1

任何人都可以解釋爲什麼MyCLController類的單一實例樣品iPhone應用程序使用LocateMe發現hereiphone單一實例

以及保留,retainCount,釋放和自動釋放的首要?任何幫助將非常感謝!

回答

5

因爲在應用程序中只需要一個MyCLController實例。

該例中的單例實現是超防禦模式。它覆蓋了所有其他方法,以防止您有可能釋放實例。

就個人而言,我從來沒有過這樣的箍(和文檔將在未來被改變),寧願做一個死的簡單+ sharedInstance方法代替:

+ sharedInstance 
{ 
    static id sharedInstance = nil; 
    if (!sharedInstance) { 
     sharedInstance = [self alloc]; 
     sharedInstance = [sharedInstance init]; 
    } 

    return sharedInstance; 
} 

(1)是的,我分手了有用的alloc/init。它允許-init方法調用+ sharedInstance中的任何內容,而不會出現問題。 (2)不,這不涉及多線程。爲此,我使用GCD的dispatch_once()。在iPhone上,你需要一個稍微不同的模式。 @synchronized()的作品,但開銷。

其中一個原因就是爲什麼我發現防禦模式令人不安是因爲,坦率地說,如果你有一個單例類,並且導致它通過過度釋放而被釋放,那麼你的代碼就會被破壞,的bug不應該被掩蓋。如果有的話,代碼應該是災難性的。同樣,有很多情況下單個類也可能對個別實例有效。