0

我有两个疑问

  1. 我正在运行一个示例应用程序,其中实现了单个视图控制器。当我使用 Instrument 检查内存时,它显示3.66 MB 。想知道为什么它会占用如此多的 RAM,因为应用程序中没有什么重的东西。

  2. 当我使用大小为25 KB的图像添加 UIImageview 时,内存使用量达到4.24 MB
    [我知道背后的原因是“图像已解压缩320*480*4 = 580 KB ”但需要对此进行更多调试& 它仍然在缓存中]

沿着这一点,我还观察到了两种情况

  1. 当我们使用api[UIImage imageNamed:aName]加载图像时,调用[UIImageview release]没有任何效果。

  2. 但是当我们使用

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:aName ofType:nil]];

我打电话时清理了一些内存[UIImageview release]

在我的应用程序中,我将使用大量图像,这将导致内存不足并导致应用程序崩溃。

请为我提供一些参考或路径来分析为什么会出现这种行为。

谢谢,

萨加尔

4

2 回答 2

2

试图让你的应用程序适应内存是一场失败的游戏。它会引导你走上奇怪的道路,试图找出你正在运行的设备类型,基于该设备交换资源等等,等等。

更好的选择是设计您的内存结构以实现可抛弃性,然后在您收到内存不足的通知时支持相当苛刻的抛弃方案。继续使用内存——它就在那里——让低内存警告成为你修剪未使用资源的信号。

很多人似乎对他们的应用程序生成内存警告感到难过。这很愚蠢。这里的设计模式是,想吃什么就吃什么,但是当你被告知你超重时,你会做出适当的反应。鉴于您在具有广泛内存配置文件的各种设备上运行(例如,iPhone 3G 的 RAM 是 iPhone 4 的 1/4),最好的方法就是对您何时填满敏感记忆。

您将遇到的主要障碍是从丢弃的数据中恢复。我发现最好的方法是将 UIImage 对象显式设置为nil,然后在使用它们之前测试 nil ,从包或网络重新加载它们,或者如果需要的话。

说了这么多:[UIImage imageNamed:]支持可弃坑,但你无法控制它。当 UIViewController 子类收到内存警告时,它会丢弃您使用该方法创建的缓存 UIImages,但在此之前您无能为力。即使为有问题的 UIImage 分配一个微小的东西也无济于事,因为它被缓存与它的“命名”的“名称”相关联,而不是分配给它的对象。因此,该方法适用于您将大量重复使用的图像,但即便如此,它也会在时机成熟时被修剪,您需要做出适当的响应。

于 2010-08-24T12:09:00.487 回答
0

使用 imageNamed 加载的图像由 UIKit 缓存在内存中,而使用 imageWithContentsOfFile 加载的图像则不会。

于 2010-08-24T09:26:44.803 回答