iOS4调用ImageNamed:仍然泄漏或导致内存问题?

时间:2011-06-28 00:25:14

标签: iphone objective-c ios ipod javax.imageio

显然,由于内存不足问题,我的应用程序在ipod第二代崩溃了。我做的是在用户滚动时在scrollView + pageControl中的每个视图上调用图像。当内存警告到达特定点后,应用程序崩溃了。当我收到警告时,我试图释放视图,但它仍然导致崩溃。

我用谷歌搜索了ImageNamed:显然这个api调用中存在问题,但是大多数文章说它在最近的iOS版本中修复了。

我通过调用image imageWithContentOfFile而不是imageNamed修复了这个问题,但我想知道ImageNamed是否仍然导致内存泄漏或者在视图发布时没有释放。

1 个答案:

答案 0 :(得分:7)

imageNamed:不会导致泄漏,但经常被误解,这是导致内存问题的原因。它在加载后缓存未压缩的图像,这意味着该图像在内存中立即有2个副本。如果将它用于经常使用的小图像(例如图标),这很好,因为运行时不必从磁盘上获取文件 - 它已经在缓存中可用。这会让用户遇到麻烦的是当他们使用imageNamed:来加载大图像时,比如用相机拍摄的4MP图像。该图像takes up quite a bit of memory:400万像素,每像素4个字节= 16MB内存,TWICE。如果您使用该方法为幻灯片,照片共享,相机应用程序或其他任何内容加载图像,它会加快速度。

因此,如果这些功能不符合您的需要,请使用其他一种UIImage加载方法。您的用户会感谢您。

注意:此信息来自Apple工程师,它提供了UIKit渲染会话(我认为它是#121)。希望我的笔记是正确的:)