gpt4 book ai didi

objective-c - 为什么即使我释放了大量内存以响应内存警告,iOS 也会终止我的应用程序?

转载 作者:可可西里 更新时间:2023-11-01 03:06:45 24 4
gpt4 key购买 nike

我不明白为什么 iOS 会因为内存使用而终止我的应用程序(iPad、iOS 4),即使在我释放大量内存以响应低内存警告之后也是如此。例如,这是一个典型的终止场景,我经常记录内存使用情况——查看“app”使用情况,每行的第一个 KB 值:

...
2011-12-14 13:25:42.343 Oyster[211:707] Memory usage (KB): app 268256, delta 6472, used 366800/373940
2011-12-14 13:25:43.292 Oyster[211:707] Memory usage (KB): app 273900, delta 5644, used 372444/381024
2011-12-14 13:25:44.159 Oyster[211:707] Memory usage (KB): app 282920, delta 9020, used 381464/389116
2011-12-14 13:25:45.184 Oyster[211:707] Memory usage (KB): app 272140, delta -10780, used 370684/379432
2011-12-14 13:25:46.109 Oyster[211:707] Memory usage (KB): app 260412, delta -11728, used 358956/365900
2011-12-14 13:25:48.443 Oyster[211:707] Received memory warning. Level=2
2011-12-14 13:25:48.454 Oyster[211:707] Memory usage (KB): app 9172, delta -251240, used 107716/112548
(gdb)

您可以看到应用内存使用量不断增加,直到它收到内存警告。然后我正确地响应了内存警告并释放了一堆(250MB!)内存。那时我的应用程序终止,iOS 转到 iPad 主屏幕。

此处的“内存使用”日志与我的 logMemoryUsage() function 一起显示它基于 this answer 中的代码.

为了记录,我正在使用 SDWebImage在内存中缓存 UIImages,但如图所示,它通过清空缓存(此时相当大)来处理内存警告。我意识到我可以调整 SDWebImage 的缓存以不填满所有可用内存并等待内存警告,但这引出了以下问题......

为什么 iOS 会终止我的应用程序,即使我通过愉快地释放大量内存来响应内存警告?

最佳答案

这是对内存管理等良好实践的一般回答。一般来说,听起来内存中的缓存只是变得太大了,即使它释放对象以响应内存警告,到那个时候它也太大了晚了。

  1. 内存警告本身并不是“坏”的,您无法避免它们。它们是 iOS 生命周期的正常组成部分,您必须通过释放所有对象中的所有非必要数据来正确处理它们,以确保您的应用程序以负责任的方式运行。即使您的应用程序占用空间很小,您仍然可能会收到有关设备上其他情况的内存警告 b/c(例如,正在使用的其他应用程序等)。我在这里指的是运行时通知 UIApplicationDidReceiveMemoryWarningNotification。调试器消息(例如“收到内存警告。Level=2”)特定于您的应用,但它们不一定与接收运行时通知相关。

  2. 我不太了解SDWebCache。我会查看实现并确保它有效地释放内存。例如,在相关位置使用 @autoreleasepool 可能有助于它在运行循环中更有效地释放对象。

  3. 您应该尽量限制应用程序的内存占用。对图像数据使用内存缓存很好,但我会限制它的大小。如果您的应用程序的占用空间超过 250MB,即使您处理内存警告,我也不会感到惊讶它会被终止。到那时可能为时已晚。

  4. 您可能有其他问题导致/促成终止。正如评论所建议的那样,您需要在仪器中进行更多调试以查找泄漏、访问错误等。在此处发布崩溃日志会有所帮助。

关于objective-c - 为什么即使我释放了大量内存以响应内存警告,iOS 也会终止我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com