2011-07-05 31 views
3

[[UIImage alloc] initWithContentsOfFile:path]initWithContentsOfFile:路徑]存儲器管理時返回nil

返回零當該方法無法初始化圖像。然後,接下來的代碼不釋放所分配的UIImage,因爲圖像是零的[image release]行:

UIImage* image = [[UIImage alloc] initWithContentsOfFile:path]; 
if(image) 
{ 
.... 
} 
//Here image is nil and not releases allocated UIImage. 
[image release]; 

這真的是內存泄漏?

如果init返回nil,如何釋放該對象?如果我做了

和圖像是零,因爲初始化失敗, [image release]與[nil release]相同。好吧,沒有錯誤,但沒有釋放任何東西。

回答

1

這個例子中的保留計數與圖像是否爲零無關。您可以手動分配使用

UIImage* test = [UIImage alloc]; 

的圖像,因此,保留計數將是一個直到您手動釋放它,因爲你是該對象的唯一所有者。

有關該主題的更多信息,請參閱Memory Management Rules

+0

是的但如果init返回nil,如何釋放該對象?如果我做了 和圖像爲零, [image release]與[nil release]相同,並且不釋放分配的對象 –

+0

您不需要釋放它,因爲它是零,但它不會傷害呼叫'[image release]'無論如何,因爲圖像可能並不總是零。請不要使用保留計數來確定一個對象是否將內存視爲兩個完全不同的東西;這是我認爲你感到困惑的地方。請參閱我發佈的鏈接。 –

1

releasenil是一個沒有操作,所以總是沒問題。它不會泄漏,因爲你沒有一個對象開始。

UIImage* test = [UIImage alloc]; 

test已經對自己的UIImage對象(雖然你沒有在該行進行初始化)。

你真的應該總是在同一行(和在同一個變量上)做alloc/init - 否則代碼邏輯真的很難遵循。您的代碼只生成一個對象,然後將其分配給另一個變量。

這是相同的,但更加清晰:

UIImage* test = [[UIImage alloc] initWithContentsOfFile:path]; 
UIImage* image = test; 
int n = [test retainCount] 

這顯然testimage是同一對象(並因此具有相同的retainCount)。無論何時釋放其中的一個,該物體都會消失(除非您之前使用過retain)。

請注意,retainCount而不是你應該依賴或做出很多假設。最好的情況往往是誤導。

+0

我想說 –

+2

如果alloc/init返回nil,則沒有剩餘內存需要釋放。一切安好。在nil上調用釋放不會傷害,這很方便。 – Eiko