2009-09-14 56 views
0

我已經做了研究,並嘗試了好幾次釋放UIImage內存,並沒有成功。我在互聯網上看到另外一個帖子,其他人也有同樣的問題。每次調用imageScaledToSize時,ObjectAlloc都會繼續爬升。iPhone - UIImage imageScaledToSize內存問題

在下面的代碼中,我從我的資源目錄中拉出一個本地圖像,並用一些模糊來調整它的大小。 有人可以提供一些幫助,如何釋放名爲.... scaledImage和labelImage UIImages的內存。這是iPhone Intruments顯示有ObjectAlloc構建的代碼塊。這段代碼被NSTimer調用了幾次。

//Get local image from inside resource 
NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"]; 
    NSData * imageData = [NSData dataWithContentsOfFile:fileLocation]; 
    UIImage * blurMe = [UIImage imageWithData:imageData]; 

//Resize and blur image 
    UIImage * scaledImage = [blurMe _imageScaledToSize:CGSizeMake(blurMe.size.width/dblBlurLevel, blurMe.size.width/dblBlurLevel) interpolationQuality:3.0]; 
    UIImage * labelImage = [scaledImage _imageScaledToSize:blurMe.size interpolationQuality:3.0]; 
    imgView.image = labelImage; 
+0

其他人是否有另一種可能的解決方案呢?由於imageScaledToSize調用,我的objectalloc仍然在攀升 – bbullis21 2009-09-16 03:08:01

回答

0

你可以用在NSAutoreleasePool,他們的結果將被彙集的電話。然後,您可以調用該游泳池上的[pool drain],其內容將被釋放,包括圖像。然而

請注意,您將無法使用NSAutoreleasePool的範圍外的圖像,因此您的代碼可能要看起來像:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

UIImage * scaledImage = [blurMe _imageScaledToSize:CGSizeMake(blurMe.size.width/dblBlurLevel, blurMe.size.width/dblBlurLevel) interpolationQuality:3.0]; 
UIImage * labelImage = [scaledImage _imageScaledToSize:blurMe.size interpolationQuality:3.0]; 
UIImage * imageCopy = [[UIImage alloc] initWithCGImage:labelImage.CGImage]; // Gives a non-autoreleased copy of labelImage 

[pool drain]; // deallocates scaledImage and labelImage 

imgView.image = imageCopy; // retains imageCopy 

UPDATE:

如果以上仍然會給您帶來問題,請參閱我發佈到this question的解決方案。這個問題涉及將圖像旋轉90度而不是縮放,但前提是相同的(只是矩陣變換不同)。使用類似於我發佈的答案中的代碼應該可以更好地控制內存管理,並避免使用未公開的API(如_imageScaledToSize)。

+0

你會碰巧有一個小例子嗎?我從來沒有使用過NSAutoreleasePool – bbullis21 2009-09-14 22:55:26

+0

這可能是一個愚蠢的問題,但如果我無法使用NSAutorelease Pool之外的圖像,我將如何在您的示例中使用imageCopy? – bbullis21 2009-09-14 23:01:08

+0

(我更新了這個例子,試圖更清楚些。)'imageCopy'沒有放入autorelease池中,並且需要你的代碼進行內存管理,這是你想要的,因爲你在'imgView'中使用它將持續比自動釋放池更長的時間。 autorelease池中的圖像 - labelImage和scaledImage - 在池已經耗盡後沒有引用,所以你沒事。 – fbrereto 2009-09-14 23:10:50