2011-04-02 54 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较少的旧设备上。