我正在使用滑块的值将图像加载到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中时,“卸载”图像会发生什么?
提前致谢。
答案 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)也会导致内存问题,尤其是在内存较少的旧设备上。