内存[Real RAM]由App在iPhone 4.0上使用,然后使用UIImageview

时间:2010-08-24 09:22:40

标签: iphone iphone-4

我有两个问题

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

  2. 当我使用尺寸 25 KB 的图片添加UIImageview时,内存使用转到 4.24 MB
    [我开始知道背后的原因是“图像已打开 320 * 480 * 4 = 580 KB ”,但需要对此进行更多调试。它保留在缓存中]

  3. 此外,我还观察了两种情况

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

    2. 但是当我们使用

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

      当我拨打[UIImageview release]

      时,会清理一些内存

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

      请给我一些参考或路径来分析这种行为的原因。

      谢谢,

      Sagar

2 个答案:

答案 0 :(得分:2)

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

更好的选择是为可倾斜性设计你的内存结构,然后在你收到低内存条件的通知时支持相当苛刻的开沟方案。继续使用内存 - 它就在那里 - 让低内存警告成为你修剪掉未使用资源的信号。

许多人似乎对他们的应用程序产生内存警告感到不舒服。那太傻了。这里的设计模式是,吃你想吃的所有东西,但是当你被告知你超重的时候会做出适当的反应。鉴于您在各种各样的设备上运行,具有广泛的内存配置文件(例如,iPhone 3G的内存是iPhone 4的1/4),最好的方法就是对您填充的时候保持敏感存储器中。

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

所有这一切:[UIImage imageNamed:]支持ditchability,但你无法控制它。当UIViewController子类获得内存警告时,它会抛弃您使用该方法创建的缓存UIImages,但是您无法做任何事情会使它们消失。即使为有问题的UIImage分配一些小东西也无济于事,因为它被缓存与“命名”的“名称”相关联,而不是它所分配的对象。因此,这种方法适用于您将要重复使用的图像,但即便如此,它也会在时机成熟时被修剪,您需要做出适当的响应。

答案 1 :(得分:0)

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