12

我有一个现有的应用程序,我最近对其进行了一些更改,并且我一直在测试这些更改。该应用程序在我测试的每台 iPad(iOS 4 和 iOS 5)上都运行良好。在我的应用程序中加载几个(50+)图像重视图后,我收到内存不足警告,并且我的 viewDidUnload 方法被调用,它们正确地清除了所有控件,我的内存中图像缓存自行清除,应用程序继续美好的。

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

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

这个现有的问题是类似的:

IOS 应用程序因内存不足而被终止,但未收到内存警告

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

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

关于可能发生的事情有什么想法吗?


添加于 2012 年 3 月 26 日:

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

新 iPad:内存不足警告未出现?

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

我已经进行了一些广泛的测试,并列出了我正确收到内存不足警告的设备和我从未收到过的设备列表。到目前为止,我只在 iOS5 或更高版本上看到了这个问题,但是在 iOS 5.0 和 5.1 的 iPad1s 上我没有看到这个问题,所以这不仅仅是 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

4 回答 4

2

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

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

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

于 2012-03-28T20:49:50.943 回答
1

我正在 iPad 3 上开发一个包含大量大图像的应用程序。

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

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

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

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

于 2012-06-27T12:26:27.700 回答
0

您可以尝试在 Instruments 中运行“Time Profiler”工具吗?它会告诉您是否在不同的线程中受 CPU 限制(除非您自己创建它们,否则我会感到惊讶)。如果没有发现确凿证据,那么运行“分配”工具也很好。

于 2012-03-24T00:57:54.797 回答
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

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

我没有在这个应用程序中做任何繁重的 UIImage 处理。操作系统的行为似乎发生了变化——要么是故意更积极地杀死应用程序(例如,试图更聪明地杀死看起来好像内存使用量过大的应用程序),要么就是内存不足通知被破坏了。

于 2012-04-16T09:28:38.897 回答