2011-06-28 30 views
1

因此很明显,在iPod第二代我的应用程序崩溃是由于内存不足的问题。我做的是在用户滚动时在scrollView + pageControl内的每个视图上调用图像。在获得记忆警告后,它在达到某个特定点时崩溃。当我收到警告时,我试图释放视图,但仍然导致崩溃。iOS4调用ImageNamed:仍然泄漏或导致内存问题?

我GOOGLE了约ImageNamed:显然有这个API调用中的问题,但大多数文章说,这是固定在最近的iOS版本。

我解决了这个问题,调用图像imageWithContentOfFile代替imageNamed,但我想知道如果ImageNamed还是引起了内存泄漏,或者视图被释放时没有释放。

+0

什么操作系统版本在你的iPod touch第二代运行? –

+0

我相信它的iOS 4.2.1 – REALFREE

+0

它没有泄漏图像,它缓存它(如RyanR下面解释的),只使用'imageNamed:'为小图像,这将永远由您的应用程序和多个位置使用 – bshirley

回答

7

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

所以,如果这些功能不适合你所需要的,请使用其他UIImage的运输方式之一。你的用户会感谢你。

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

+0

我明白imagenamed缓存图像文件,但我的图像是非常小的(40kb至500kb),仍然最终在iPod的第二代内存上遇到麻烦..大概第二代有相当少量的内存? (在iPhone4上正常工作) – REALFREE

+0

可能是这样的。另外,500kb可能是图像的_compressed_大小,但内存中的大小会更多:长度x宽度x每像素的位数。你是否试过在乐器中运行它? – RyanR

+0

是的,我检查了仪器,我没有看到那么多的分配发生。这是大约1-2MB的分配总计 – REALFREE