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

Posted

技术标签:

【中文标题】iOS4 调用 ImageNamed:仍然泄漏或导致内存问题?【英文标题】:iOS4 calling ImageNamed: still leak or cause memory issue? 【发布时间】:2011-06-28 00:25:14 【问题描述】:

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

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

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

【问题讨论】:

您的 iPod Touch 2g 上运行的操作系统版本是什么? 它没有泄漏图像,它正在缓存它(如下 RyanR 解释),仅将 imageNamed: 用于您的应用程序和多个位置将始终使用的小图像 【参考方案1】:

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

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

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

【讨论】:

我了解 imageNamed 缓存图像文件,但我的图像非常小(40kb 到 500kb)并且最终在 ipod 2nd 代上出现内存问题.. 可能 2nd 代有相当小的内存量? (在 iphone4 上运行良好) 可能是这样。此外,500kb 可能是图像的 压缩 大小,但内存中的大小会大得多:长度 x 宽度 x 每像素位数。你试过在 Instruments 中运行它吗? 是的,我用仪器检查过,我没有看到太多的分配发生。总共分配了大约 1-2MB @REALFREE 那是因为分配工具不正确。关注这个:***.com/questions/2865786/… btw 500kb 图片对于移动设备来说太大了。

以上是关于iOS4 调用 ImageNamed:仍然泄漏或导致内存问题?的主要内容,如果未能解决你的问题,请参考以下文章

UIImage imageNamed:不会自动选择视网膜@2x 图像

为啥 `-[UILabel setText:]` 会泄漏?

Objective-C:CGDataProviderCopyData 的内存泄漏

仪器显示泄漏但没有物体

iOS6 中的 AudioToolBox 泄漏?

Java内存泄漏