我有两个问题
我正在运行一个示例应用程序,其中实现了单视图控制器。当我使用Instrument检查内存时,显示 3.66 MB 。想知道为什么它占用了这么多内存,因为应用程序没什么大不了的。
当我使用尺寸 25 KB 的图片添加UIImageview时,内存使用转到 4.24 MB
[我开始知道背后的原因是“图像已打开 320 * 480 * 4 = 580 KB ”,但需要对此进行更多调试。它保留在缓存中]
此外,我还观察了两种情况
当我们使用api [UIImage imageNamed:aName]
加载图片时,调用[UIImageview release]
没有任何效果。
但是当我们使用
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:aName ofType:nil]];
当我拨打[UIImageview release]
在我的应用中,我将使用大量图片,这会导致内存不足并导致应用崩溃。
请给我一些参考或路径来分析这种行为的原因。
谢谢,
Sagar
答案 0 :(得分:2)
试图让你的应用程序适合内存是一个失败的游戏。它会引导你走下奇怪的道路,试图找出你正在运行的设备类型,根据它等交换进出资源等。
更好的选择是为可倾斜性设计你的内存结构,然后在你收到低内存条件的通知时支持相当苛刻的开沟方案。继续使用内存 - 它就在那里 - 让低内存警告成为你修剪掉未使用资源的信号。
许多人似乎对他们的应用程序产生内存警告感到不舒服。那太傻了。这里的设计模式是,吃你想吃的所有东西,但是当你被告知你超重的时候会做出适当的反应。鉴于您在各种各样的设备上运行,具有广泛的内存配置文件(例如,iPhone 3G的内存是iPhone 4的1/4),最好的方法就是对您填充的时候保持敏感存储器中。
您遇到的主要障碍是从丢弃的数据中恢复。我发现最有效的方法是将UIImage对象显式设置为nil
,然后在使用之前测试nil,从bundle或网络中重新加载它们,或者在必要时重新加载它们。
所有这一切:[UIImage imageNamed:]
支持ditchability,但你无法控制它。当UIViewController子类获得内存警告时,它会抛弃您使用该方法创建的缓存UIImages,但是您无法做任何事情会使它们消失。即使为有问题的UIImage分配一些小东西也无济于事,因为它被缓存与“命名”的“名称”相关联,而不是它所分配的对象。因此,这种方法适用于您将要重复使用的图像,但即便如此,它也会在时机成熟时被修剪,您需要做出适当的响应。
答案 1 :(得分:0)
使用imageNamed加载的图像由UIKit缓存在内存中,而使用imageWithContentsOfFile加载的图像则不会。