2012-11-20 42 views
0

我已經下載了一個圖書館關閉github上,並已經注意到,在圖書館的主要單身有在該位的代碼可能泄漏:Singleton設計潛在的泄漏

+(DDGameKitHelper*) sharedGameKitHelper 
{ 
    @synchronized(self) 
    { 
     if (instanceOfGameKitHelper == nil) 
     { 
      [[DDGameKitHelper alloc] init]; 
     } 

     return instanceOfGameKitHelper; 
    } 

    return nil; 
} 

現在很明顯有沒有發佈或autorelease任何地方,所以我必須這樣做,但如何以及以什麼方式正確?我已經查看了Internet上的各種單例設計模式,並且他們只是將instanceOfGameKitHelper分配給alloc和init行。

無論如何我會妥善解決這個問題?

謝謝!

回答

2

一個更現代的方法來設置單身是這樣的:

+ (DDGameKitHelper *)sharedGameKitHelper { 
    static DDGameKitHelper *instance = nil; 
    static dispatch_once_t predicate; 

    dispatch_once(&predicate, ^{ instance = [self new]; }); 

    return instance; 
} 
+0

我喜歡它,簡單而簡潔,它使警告無聲無息。加上它更容易閱讀。 –

+0

@iBradApps正如在另一個答案中指出的那樣,警告是因爲您從未將對象分配給您的變量。 – rmaddy

+0

好吧,我明白,我upvoted兩個答案BC他們都幫我解決了這個問題。 –

2

根據定義,一個單身人士會創建一次,永遠不會被釋放。認爲它有點像全局變量。

查看Apple的此文檔:Cocoa Core Competencies - Singleton瞭解更多詳情。

或者爲他們的例子(在頁面的底部):http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

我通常使用@ rmaddy的方法雖然。當然,即使這樣,你仍然在分配變量並且永遠不會釋放它,因爲它仍然是一個單身人士。

+0

有什麼辦法沉默警告此後,除非我的應用程序沉默的人? –

+0

@iBradApps是的,實際將分配的對象分配給'instanceOfGameKitHelper'變量。 – rmaddy

+0

是的,你發佈的代碼將不會工作。將'[[DDGameKitHelper alloc] init];'更改爲'instanceOfGameKitHelper = [[DDGameKitHelper alloc] init];'。 – lnafziger