2014-03-30 68 views
0

我嘗試使用下面的代碼來調整一個for循環中幾個UIImage對象:的iOS - 調整圖像大小導致內存泄露

CGFloat scaledToWidth:resized_width = 160.0; 
for(UIImage *img in imageArray) { 
    UIImage *resizedImageSecond = [self resizeImage:img scaledToWidth:resized_width]; 
    //Do something with resizedImageSecond  
} 

-(UIImage*)resizeImage:(UIImage*) sourceImage scaledToWidth: (float) i_width 
{ 
    float oldWidth = sourceImage.size.width; 
    float scaleFactor = i_width/oldWidth; 

    float newHeight = sourceImage.size.height * scaleFactor; 
    float newWidth = oldWidth * scaleFactor; 

    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)); 
    [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    return newImage; 
} 

但我看到我的內存使用量迅速超過resizeImage:scaledToWidth:每次迭代增加。我沒有看到任何明顯的內存泄漏,但我也不確定。

有沒有人看到任何理由爲什麼我的內存使用會增加這個功能?我在這裏不知所措。不幸的是,我在imageArray內部有大約100 UIImage,所以我需要儘可能保守內存。

+0

如果您在創建後釋放調整大小的圖像,則將循環的主體包裝在一個'@ autoreleasepool'塊中。如果不是,那麼您需要找到比直線循環更少的資源密集型方法。 – CodaFi

+0

@CodaFi我的項目是ARC,所以我沒有明確地將它釋放到任何地方。我可以做? – Brett

+0

另外,使用儀器並學習部署Allocations Leaks工具,並查看具有哪些呼叫者正在遞增和遞減重新計數的列表的泄漏。這是一個寶貴的學習工具和調試工具。 – RobP

回答

1

您可以在resizeImage:scaledToWidth:的每次使用情況下創建新的UIImage實例。這是記憶力增加的原因。最簡單的解決方案是在不再需要圖像時將圖像設置爲nil

for(UIImage *img in imageArray) { 
    @autoreleasepool { 
     UIImage *resizedImage = [self resizeImage:img scaledToWidth:resized_width]; 

     //Do something with resizedImage 

     resizedImage = nil; 
    }  
} 
+0

那麼爲什麼在一個ARC項目(如我的)中,當它超出範圍時它不會被釋放? (即繼續循環?) – Brett

+0

我實際上已經設置了'resizedImage = nil',並且沒有改變。 – Brett

+0

ARC對物體生命週期不作任何保證。你所知道的是,當地人會在某個時候獲得釋放。這可能完全不能解決問題。 – CodaFi