然而,在iPhone 4和iPhone 4(iOS 5.0.1和iOS 5.1)上,我遇到了一个问题,即我的应用程序内存不足而没有收到低内存警告.在加载几个不同的视图后,最终会出现一个新的视图,大部分是空白的,在控制台上我看到内存分配消息,整个手机变得无响应,有时会杀死我的应用程序.
这种发生的特定视图每次都是不同的,所以它与任何一个视图无关,只是随着时间的推移,内存的积累.我也确认我也没有内存泄漏.
这个现在的问题是相似的:
IOS app killed for Low Memory but no Memory Warning received
那个答案表明,如果我被困在一个循环中,可能会发生这种情况,但我很确定我的代码不会停留在任何循环中.我只是在UINavigationController中从一个视图点击到另一个视图,并在每个视图中加载多个图像.另外,另一个问题是在iPad上发生的,iPad上没有看到这个问题,只有iPhone.
BTW,我已经尝试通过NotificationCenter注册低内存通知,并在我的应用程序委托中有一个applicationDidReceiveMemoryWarning方法,并且在两者都有断点,也不会被调用.此外,在调试器控制台中也不会显示低内存消息.
关于可能发生什么的任何想法?
于2012年3月26日添加:
有趣的是,当我在新的iPad上测试我的应用程序时,在iPhone 4和4s上看到的内存通知没有被接收到的同样的问题.所以我想知道我是否看到与其他线程相同的问题:
The New iPad: Low Memory Warnings Not Appearing?
但是该线程上的开发人员正在测试一个仅限iPad的应用程序,因此不会在任何iPhone上测试并发现同样的问题.
我已经进行了一些广泛的测试,并列出了我正确接收到低内存警告和我没有收到的设备的设备.到目前为止,我只看到iOS5或更高版本的问题,但是在iOS 5.0和5.1的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
解决方法
您不会说所有这些图像所在的位置 – 希望您将它们写入文件系统,然后使用[UIImage imageWithContentsOfFile](或使用CGImageRefs,然后使用CGImageSourceCreateWithURL)将其加载到视图中.您想要避免的是将内存中的图像(不会在iOS中交换!).
在我的情况下,我有一些mmap内存来保存图像,我甚至已经取消映射内存(将它同步到文件系统),但是由于同步需要很长时间,因此我被“取消”了该未锁定的内存.我所做的就是在每个这些文件上调用fcntl(fd,F_FULLSYNC)来强制系统刷新每个块,然后再继续.