2011-04-02 50 views
1

我使用滑塊的值(這些是頁面或幻燈片,如果您喜歡)將圖像加載到UIImage中。這個UIImage使用滑塊非常快速地切換它們。問題是,在某種程度上,應用程序在設備上崩潰,出現以下錯誤:IOS/iPhone基於滑塊值內存問題將圖像加載到UIImage中

2011-04-02 17:39:01.836 Book1 [2123:307]收到內存警告。等級= 1

下面的代碼:

- (IBAction)slidePages:(id)sender{ 
    int sliderValue = pageSlider.value; 

    NSString *slideToPage = [NSString stringWithFormat:@"P%i.jpg", sliderValue]; 
    imagePlaceholder.image = [UIImage imageNamed:slideToPage]; 

    pageDisplay.text = [NSString stringWithFormat:@"Page %i", sliderValue]; 

    currentPage = sliderValue; 
} 

有什麼我可以做,使之更有效率?也許錯誤是在別的地方,但我猜它與快速加載圖像有關。

不過,我不知道iOS如何處理這個問題。每次我在UIImage中加載一個新的圖像時,「空載」會發生什麼?

在此先感謝。

回答

3

[UIImage imageNamed]的一個重要方面是它緩存所有以這種方式加載的圖像,並且它們永遠不會被卸載,即使您將delloc創建的UIImage!這在某些情況下是很好的(例如UITableView單元中的小圖像),但在其他情況下不好(例如大圖像)。

解決方案是使用​​,它不會執行此緩存並在UIImage解除分配時卸載數據。

更多信息和討論在這裏:

Difference between [UIImage imageNamed...] and [UIImage imageWithData...]?

更新

This question對的,當內存警告發生[UIImage imageNamed:]不清空緩存的問題,一些好的信息。

+0

哦,謝謝!我會試試這個,讓你知道。似乎這是答案。 – HotFudgeSunday 2011-04-03 11:13:13

+0

非常感謝,就是這樣。 – HotFudgeSunday 2011-04-03 11:44:53

+0

或者您可以關閉[imageView setImage [UIImage imageNamed:@「xxx.png」]];進入NSAutoreleasePool ...這對我來說是訣竅:) – Ondrej 2011-05-02 16:48:03

2

[UIImage imageNamed:]緩存圖像,因此每個圖像如此加載有效泄漏。我不知道規範解決方案是什麼,但一種選擇可能是使用CGImageCreateWithJPEGDataProvider()加載圖像,並使用[UIImage imageWithCGImage:]對其進行初始化。


原始的(錯誤)答案:

您可能需要加載當前一個之前釋放先前的圖像。

0

在iOS中加載大量圖像一直是內存問題。正如馬塞洛提到的,你應該只保留在你目前正在查看的圖像。所有其他圖像應該釋放,以便可以收集垃圾並釋放內存。根據我的經驗,即使加載2個相當大的圖像(每個500k-2mb)都會導致內存問題,尤其是在RAM較少的舊設備上。