【问题标题】:Why does loading more than a megabyte of images consume all of my iPhone's memory?为什么加载超过一兆字节的图像会占用我所有 iPhone 的内存?
【发布时间】:2010-11-01 08:10:30
【问题描述】:

我正在编写一个需要同时在内存中保存大约 40 个 44 kb JPEG 的应用程序。我听说应用程序在触发内存不足警告之前可以使用大约 22 兆字节,所以我很确定它应该能够做到这一点。但是,一旦我加载了兆字节,这些消息就会开始在控制台中弹出:

6 月 8 日星期一 16:37:19 未知配置 [21]:内核内存事件 (90),空闲:374,活动:1736,非活动:959,可清除:0,有线:6260 6 月 8 日星期一 16:37:20 未知 configd[21]:内核内存事件 (95),空闲:363,活动:876,非活动:492,可清除:0,有线:6241 6 月 8 日星期一 16:37:20 未知 SpringBoard[22]:内存级别很关键 (5%)。没有要杀死的应用程序。将杀死 SpringBoard Mon Jun 8 16:37:24 unknown SpringBoard[22] : Jetsaming SpringBoard...

然后它让我回到主屏幕。

这是我用来加载图像的代码:

#define NUM_IMAGES 40

@interface MyClass : NSObject {
    UIImageView* imageView;
    UIImage* loadedImages[NUM_IMAGES];
}

- (void)initImages;

@property (nonatomic, retain) IBOutlet UIImageView* imageView;

@end


@implementation MyClass

@synthesize imageView;

- (void)initImages {
    int i;
    for (i = 0; i < NUM_IMAGES; i++) {
        loadedImages[i] = [UIImage imageNamed:[NSString stringWithFormat:IMAGE_FORMAT, i+1]];
    }
    imageView.image = loadedImages[0];
}

@end

我在这里做错了吗? iPhone 应用程序真的只能使用 1 兆字节的内存吗?

【问题讨论】:

    标签: iphone memory uiimage memory-management


    【解决方案1】:

    imageNamed: 将解压缩图像数据缓存未压缩的数据。我相信如果您使用imageWithContentsOfFile: 会很好,因为该方法只会存储压缩数据,并在绘图时动态解码。

    查看 SO 问题的答案Dispelling the UIImage imageNamed: FUD

    具体来说,你应该能够做到:

    [UIImage imageWithContentsOfFile:[[UIBundle mainBundle] pathForResource:@"filename" ofType:@"jpeg"]];
    

    【讨论】:

      【解决方案2】:

      当您加载压缩图像(例如 JPEG 图像)时,它通常是未压缩的(因为您需要这样做,以便您可以对图像执行一些有用的操作,例如显示或操作它)。

      未压缩的图像肯定会大于 JPEG 格式的 压缩 图像占用的 44 KiB(大约 3 或 4 字节乘以宽度和高度)。因此,仅查看 JPEG 大小时,内存耗尽的速度比您想象的要快。

      如果您真的只需要将 JPEG 保存在内存中(并且什么都不做,只是保存它们),您可以考虑将原始字节流存储在内存中,然后仅在您真正需要时将其作为图像加载。

      但可能还有其他选择,具体取决于您需要做什么。你真的需要一次在内存中的所有图像吗?您可以推迟加载单个图像直到需要它(并在那时卸载其他图像)以节省内存?您是否只需要可以缓存的每个图像中的某些信息(之后您将不再需要 图像 本身)?等等……

      【讨论】:

      • 感谢您的解释,它有帮助。我已经让它将全分辨率图像的 JPEG 数据保存在内存中,并在更改或加载图像时显示四分之一分辨率的图像。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多