使用儀器,我一直在使用UIImage指出內存泄漏。
我想我正確地分配和釋放內存。儀器中泄漏的物體被描述爲NSConcreteData什麼是正確的方式來分配一個UIImage到內存並釋放它iphone
以下是分配和釋放UIImage的正確方法嗎?
UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];
[flagimg release];
flagimg =nil;
使用儀器,我一直在使用UIImage指出內存泄漏。
我想我正確地分配和釋放內存。儀器中泄漏的物體被描述爲NSConcreteData什麼是正確的方式來分配一個UIImage到內存並釋放它iphone
以下是分配和釋放UIImage的正確方法嗎?
UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];
[flagimg release];
flagimg =nil;
[UIImage imageWithData:]
返回一個自動釋放的對象,不應該再次釋放您的對象。因此,這段代碼被剪掉的內容不是內存泄漏,而是相反的,是雙重釋放(在最壞的情況下)。
請注意,樂器有時會在基金會本身產生誤報和/或報告內存泄漏(是的,他們也犯了錯誤:-)。
到頁頭的最快方法/釋放的目的是避免方便初始化(如imageWithData :),而是以類似
NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
UIImage* img = [[UIImage alloc] initWithData:data];
[data release];
// use your image
[img release];
這將分配和釋放你的對象的時候了,而不是等到autorelease池被清理。
但請注意一點,就是內存泄漏通常不是內存,是不是尚未中解脫出來,但丟失,不能再釋放,所以這將是由自動釋放池被釋放的對象不考慮了內存泄漏。
兩個imageWithData
和dataWithContentsOfURL
返回自動釋放的對象,所以你應該在那些代碼段沒有內存泄漏。
由於flagimg
返回自動發佈,您的[flagimg release];
調用不需要;你過度釋放該對象。
作爲一般規則,你可以說
,如果你創建一個對象的一個孤單「初始化」,「複製」或爲「保留」,你必須將其釋放。如果不是,你會得到一個autoreleased對象。
這並不總是如此,但在大多數情況下,
什麼是「雙釋放」的結果? – dubbeat 2010-03-24 11:39:30
通常會導致程序崩潰的EXC_BAD_ACCESS(通常稱爲段錯誤)。如果您有一個已經釋放的對象並嘗試訪問它,那麼也會發生這種情況。 – Alfonso 2010-03-24 11:48:11