iOS应用程序内存不足而没有收到内存不足警告

时间:2012-03-24 00:45:26

标签: ios notifications low-memory

我有一个现有的应用程序,我做了一些最近的更改,我一直在测试这些更改。该应用程序在我测试的每个iPad上运行得非常好(iOS 4和iOS 5)。在我的应用程序中加载了几个(50+)图像密集的视图后,我得到一个低内存警告,我的viewDidUnload方法被调用,他们正确地将所有控件都清零,我的内存中图像缓存清除了自己,应用程序继续细

然而,在iPhone 4和iPhone4s(iOS 5.0.1和iOS 5.1)上,我遇到了一个问题,即我的应用程序内存不足而没有收到低内存警告。在加载了几个不同的视图后,最终会出现一个新的视图并且大部分是空白的,并且在控制台上我看到内存分配消息,整个手机变得没有响应,有时会杀死我的应用程序。

这种情况发生的特定视图每次都不同,因此它与任何一个视图无关,只是随着时间的推移而积累的内存。我也确认我也没有任何内存泄漏。

这个现有问题类似:

IOS app killed for Low Memory but no Memory Warning received

并且答案表明,如果我陷入循环中,可能会发生这种情况,但我很确定我的代码不会卡在任何循环中。我只是在UINavigationController中从一个视图点击到另一个视图,并在每个视图中加载了几个图像。另外,另一个问题是专门在iPad上发生的,我在iPad上没有看到这个问题,只有iPhone。

顺便说一下,我已经尝试通过NotificationCenter注册低内存通知,并在我的应用委托中有一个applicationDidReceiveMemoryWarning方法,并且两者都有断点,并且都没有被调用。此外,调试器控制台中也没有显示低内存消息。

关于可能发生的事情的任何想法?


于2012年3月26日添加:

有趣的是,当我在新iPad上测试我的应用程序时,它遇到了我在iPhone 4和4s上看到的同样的问题,其中没有收到低内存通知。所以我想知道我是否看到了与其他线程相同的问题:

The New iPad: Low Memory Warnings Not Appearing?

但该线程上的开发人员正在测试仅限iPad的应用程序,因此无法在任何iPhone上测试并发现同样的问题。

我已经做了一些广泛的测试并且有一个设备列表,我正确地收到了低内存警告和我从未收到它的设备。到目前为止,我只看到iOS5或更高版本上的问题,但是在iOS1和iOS5的iPad1上我没有看到问题,所以它不仅仅是iOS 5上所有设备上的问题。

以下是该列表:

适当的低内存警告

iPad1 4.2.1
iPad1 5.0
iPad1 5.1
iPad2 4.3.3
iPhone3G 4.2.1
iPod 3G 4.3.3
iPhone4 4.3.3

没有低内存警告

iPhone4 5.1
iPhone4s 5.0.1
iPad3 5.1

4 个答案:

答案 0 :(得分:2)

过去一周,我一直在抨击类似的问题。我正在做一些不同的事情,但图像有点相关。

您没有说明所有这些图像的位置 - 希望您将它们写入文件系统,然后使用[UIImage imageWithContentsOfFile]将它们加载到视图中(或者如果使用CGImageRefs,则使用CGImageSourceCreateWithURL)。你想要避免的是将图像存储在内存中(在iOS中没有交换!)。

在我的情况下,我有一些mmap内存来保存图像,我甚至没有映射内存(它将它同步到文件系统),但由于同步需要很长时间,我被“收费”的那个未同步的内存。我所做的实际上是在每个文件上调用fcntl(fd,F_FULLSYNC)来强制系统在我继续之前刷新每个块。

答案 1 :(得分:1)

我正在iPad 3上制作一款包含大量大图像的应用程序。

如果我将iOS 5.0设置为部署目标,如果应用程序消耗太多内存,应用程序崩溃,则不会调用applicationDidReceiveMemoryWarning

但是,如果我将iOS 5.1设置为部署目标,applicationDidReceiveMemoryWarning会被称为。因此,操作系统刷新包含先前加载的图像的缓存,并且应用程序不会崩溃。

主要问题是我使用UIImage imageNamed:来加载我的图片,如果你的图片大量使用UIImage imageWithContentsOfFile,那么它们就不会被缓存(如果大小的话,这是一个问题@ 2x非常大)。

请注意,如果我非常快速地显示许多图像,则在iOS 5.1中无法及时调用applicationDidReceiveMemoryWarning,而且会崩溃!

答案 2 :(得分:0)

您可以尝试在“仪器”中运行“Time Profiler”工具吗?它会告诉你你是否在一个不同的线程中绑定CPU(虽然除非你自己创建它们,但如果是这样的话,我会感到惊讶)。如果不显示吸烟枪,也可以运行“Allocations”仪器。

答案 3 :(得分:0)

我在运行iOS 5.1的iPad 3上找到了确切的行为。不会调用applicationDidReceiveMemoryWarning,也不会调用UIApplicationDidReceiveMemoryWarningNotification的NSNotifications。我还在其他一些设备上测试了完全相同的代码,因此您可以将这些代码添加到列表中:

适当的低内存警告

iPad 2 5.0.1
iPad 2 4.3.5
iPhone 3GS 5.0.1

没有低内存警告

iPad 3 5.1

模式可以是:具有512 MB的iOS设备或运行5.0.1 - 5.1的1 GB内存。

我没有在这个应用程序中进行任何繁重的UIImage处理。似乎操作系统的行为已经发生了变化 - 要么是故意杀死应用程序更积极(例如,试图更聪明地杀死看起来好像内存使用过于繁重的应用程序),要么只是打破了低内存通知。 / p>