IOS / iPhone根据滑块值内存问题将图像加载到UIImage中

时间:2011-04-02 22:08:10

标签: iphone cocoa-touch ios ipad

我正在使用滑块的值将图像加载到UIImage中(如果您愿意,这些是页面或幻灯片)。这个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 个答案:

答案 0 :(得分:3)

[UIImage imageNamed]的一个重要方面是它缓存以这种方式加载的所有图像,并且它们永远不会被卸载,即使你释放了创建的UIImage!这在某些情况下很好(例如UITableView单元格中的小图像),但在其他情况下则很糟糕(例如大图像)。

解决方案是使用不执行此缓存的[UIImage imageWithData],并在取消分配UIImage时卸载数据。

此处有更多信息和讨论:

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

更新

This question[UIImage imageNamed:]发生内存警告时没有清空缓存的问题上有一些很好的信息。

答案 1 :(得分:2)

[UIImage imageNamed:]缓存图像,因此每次加载的图像都会有效泄漏。我不知道规范解决方案是什么,但一种选择可能是使用CGImageCreateWithJPEGDataProvider()加载图像并使用[UIImage imageWithCGImage:]初始化它。


原始(错误)答案:

您可能需要在加载当前图像之前释放上一张图像。

答案 2 :(得分:0)

在iOS中加载一堆大图像一直是内存问题。正如马塞洛所说,你应该只保留你目前正在观看的图像。应该释放所有其他图像,以便它们可以被垃圾收集并释放内存。根据我的经验,即使加载2个相当大的图像(每个500k-2mb)也会导致内存问题,尤其是在内存较少的旧设备上。