处理iPhone中的内存不足错误

时间:2010-05-07 17:40:45

标签: iphone objective-c memory-management uiimage out-of-memory

我想处理iPhone中的内存不足错误,以便在运行内存时执行内存要求较低的逻辑。特别是,我想做一些非常类似于以下伪代码的事情:

UIImage* image;
try  {
    image = [UIImage imageNamed:@"high_quality_image.png"];
} catch (OutOfMemoryException e) {
    image = [UIImage imageNamed:@"low_quality_image.jpg"];
}

首先,我尝试加载高质量的图像,如果在执行此操作时内存不足,则使用质量较低的图像。

这可能吗?当发生内存不足错误时,是否存在某种异常或通知?

内存不足警告不是我正在寻找的,因为它已经收到手机内存不足。我想知道我执行的逻辑是否因内存不足而失败,并相应处理。

或者,这样的事情也有帮助:

UIImage* image;
if (enoughMemory) {
    image = [UIImage imageNamed:@"high_quality_image.png"];
} else {
    image = [UIImage imageNamed:@"low_quality_image.jpg"];
}

3 个答案:

答案 0 :(得分:3)

这是一个答案,可以为您提供应用程序使用的当前内存,您可以根据该信息决定要做什么。

iphone memory usuage

答案 1 :(得分:0)

iPhone具有低内存警告,当达到某个内存阈值时会触发该警告。此回调发布到应用程序,必须进行适当的响应,否则您的应用程序可能会被操作系统抢占。那时候,你的应用程序将高内存映像转换为内存较低的映像会很好。

但请注意,因为磁盘上文件的大小不一定代表一旦加载并准备好在设备上使用它将消耗多少内存。

有关处理内存不足警告的详细信息,请参阅here

答案 2 :(得分:0)

编辑:看起来这不是你问题的答案。


你想用图像做什么?一些动作,例如存储从图像选择器控制器返回的全尺寸图像,是特别重的存储器用户。

我建议您始终假设您需要始终使用最小尺寸的图像,并且:

  1. 如果以后需要高分辨率图像,请将其缓存到磁盘。
  2. 所有用于显示的图像都应该是您可以逃脱的最低分辨率。
  3. 当您需要高分辨率图像时,请将其从缓存中拉回来。
  4. 使用低内存警告作为标记,以释放内存中的所有图像,但不可见。
  5. 现在,这种情况可能不适合你。在iPhone上读取和写入大图像到磁盘很慢。如果是这样的话你需要做的就是按照@ fbrereto的建议:加载大图像,注意内存警告,如果你得到一个,丢弃它并加载小图像。

    你绝对不应该忽略内存警告,但不响应一个不一定会使你的应用程序崩溃。几乎每次我从UIImagePickerController获取图像时,我的iPhone 3G都会收到内存警告,而我无能为力。