1

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

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

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

4

1 回答 1

7

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

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

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

于 2011-06-28T01:49:48.217 回答