2012-04-20 98 views
1

所以我有這個方法,我看到一個開源項目,它只是令我難以置信,當我嘗試運行靜態分析器時,這不會泄漏內存。我認爲它應該泄漏的原因是因爲它分配內存但從不釋放它。它每次調用該方法時都會釋放它(因爲= nil)。任何人都可以爲我散光嗎?爲什麼不是這個NSMutableSet泄漏內存

- (BOOL)isValid(NSString *)name 
{ 
    // Using a set so access is faster 
    static NSMutableSet *exp = nil; 

    // Setup the set once with AB testing info 
    if (exp == nil) { 

      exp = [[NSMutableSet alloc] initWithCapacity:5]; 

    } 

    if (exp != nil) { 
     return YES; 
    } 

    return NO; 
} 
+0

你使用弧 – 2012-04-20 17:42:46

+0

不,這不是..我沒有這個東道主尚未.. – adit 2012-04-20 17:44:12

+0

它是否抱怨,如果它不是一個靜態?鑑於exp是靜態的,你不希望它抱怨。你不會像保留靜態對象那樣泄漏太多東西。 – Obliquely 2012-04-20 17:44:35

回答

5

分析儀識別static存儲預選賽,並理解它不出去的範圍(直至終止,當然)。

它每次調用方法都會釋放它(因爲= nil)。

並非如此。這是第一次調用該方法時發生的 - 只有一次,因爲它是static

+0

但它實際上是否泄漏?問題是我應該在方法 – adit 2012-04-20 17:46:58

+0

nope的末尾釋放它。我還添加了一些關於初始化的內容。在某種程度上,它永遠不會被釋放,直到終止。但這只是一個例子(假設當然沒有競爭條件)。這實際上是全球數據如何工作的原因,並且分析器沒有足夠的信息來靜態確定該對象可以根據其類型進行更早的解除分配。但是,這也會改變返回值,因此它的處理是恰當的。 – justin 2012-04-20 17:47:52

+0

嗯......它是如何靜態NSMutableSet * exp = nil;被稱爲第一次?什麼時候發佈然後 – adit 2012-04-20 17:52:49

2

分析儀不抱怨,因爲exp是靜態的。嘗試再次分析,而沒有靜態,你會得到抱怨。 (我剛剛在Xcode中驗證了這一點 - 用ARC關閉。)

想想靜態是什麼,你可以看到爲什麼沒有投訴。你正在告訴編譯器這個變量將保持指向該對象。這只是一個漏洞,如果沒有任何東西指向對象,並且沒有釋放內存的機會。

+0

,但只是看到上面的代碼..它似乎泄漏,因爲我正在分配,如果我不再次調用該函數,我不會釋放它 – adit 2012-04-20 17:49:00

+1

你沒有泄漏,因爲exp仍然指向對象。該對象仍然在並指向。這是一個保留的對象,而不是泄露的。泄漏的對象是一個永遠不會被釋放的對象,因爲你已經失去了它所在的位置。分配和不釋放不一樣泄漏。有時你想故意這樣做,例如通過使用靜態,比照。如何實施單身人士。 – Obliquely 2012-04-20 17:51:21

+0

好吧,我想你只是啓發我,分配和不釋放不是泄露。感謝那 – adit 2012-04-20 17:54:01