2010-03-24 45 views

回答

8

[UIImage imageWithData:]返回一個自動釋放的對象,不應該再次釋放您的對象。因此,這段代碼被剪掉的內容不是內存泄漏,而是相反的,是雙重釋放(在最壞的情況下)。

請注意,樂器有時會在基金會本身產生誤報和/或報告內存泄漏(是的,他們也犯了錯誤:-)。

到頁頭的最快方法/釋放的目的是避免方便初始化(如imageWithData :),而是以類似

NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
UIImage* img = [[UIImage alloc] initWithData:data];
[data release];
// use your image
[img release];

這將分配和釋放你的對象的時候了,而不是等到autorelease池被清理。

但請注意一點,就是內存泄漏通常不是內存,是不是尚未中解脫出來,但丟失,不能再釋放,所以這將是由自動釋放池被釋放的對象不考慮了內存泄漏。

+0

什麼是「雙釋放」的結果? – dubbeat 2010-03-24 11:39:30

+0

通常會導致程序崩潰的EXC_BAD_ACCESS(通常稱爲段錯誤)。如果您有一個已經釋放的對象並嘗試訪問它,那麼也會發生這種情況。 – Alfonso 2010-03-24 11:48:11

0

兩個imageWithDatadataWithContentsOfURL返回自動釋放的對象,所以你應該在那些代碼段沒有內存泄漏。

由於flagimg返回自動發佈,您的[flagimg release];調用不需要;你過度釋放該對象。

1

作爲一般規則,你可以說

,如果你創建一個對象的一個​​孤單「初始化」,「複製」或爲「保留」,你必須將其釋放。如果不是,你會得到一個autoreleased對象。

這並不總是如此,但在大多數情況下,