【问题标题】:IOS / iPhone loading images into UIImage based on slider value memory issueIOS / iPhone基于滑块值内存问题将图像加载到UIImage中
【发布时间】:2011-04-02 22:08:10
【问题描述】:

我正在使用滑块的值将图像加载到 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 中时,“未加载”的图像会发生什么?

提前致谢。

【问题讨论】:

    标签: iphone cocoa-touch ios ipad


    【解决方案1】:

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

    解决方案是使用[UIImage imageWithData],它不进行此缓存,并在 UIImage 被释放时卸载数据。

    更多信息和讨论在这里:

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

    更新

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

    【讨论】:

    • 哦,谢谢!我会试试这个,让你知道。似乎这就是答案。
    • 非常感谢,就是这样。
    • 或者可以关闭[imageView setImage[UIImage imageNamed:@"xxx.png"]];进入 NSAutoreleasePool ...这对我有用:)
    • 你确定吗,Ondrej?您是否确认 imageNamed 缓存的数据实际上是通过使用分配监视器或类似的工具工具释放的?
    【解决方案2】:

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


    原来的(错误的)答案:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-06
        • 2017-03-13
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 2016-02-14
        • 1970-01-01
        相关资源
        最近更新 更多