Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么iOS会在我释放大量内存以响应内存警告时终止我的应用程序?_Objective C_Ios_Memory Management_Terminate_Sdwebimage - Fatal编程技术网

Objective c 为什么iOS会在我释放大量内存以响应内存警告时终止我的应用程序?

Objective c 为什么iOS会在我释放大量内存以响应内存警告时终止我的应用程序?,objective-c,ios,memory-management,terminate,sdwebimage,Objective C,Ios,Memory Management,Terminate,Sdwebimage,我不明白为什么iOS会因为内存使用而终止我的应用程序(iPad,iOS 4),即使在我释放了大量内存以响应内存不足警告之后。例如,这里有一个典型的终止场景,我经常记录内存使用情况——看看“应用”使用情况,每行的第一个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[

我不明白为什么iOS会因为内存使用而终止我的应用程序(iPad,iOS 4),即使在我释放了大量内存以响应内存不足警告之后。例如,这里有一个典型的终止场景,我经常记录内存使用情况——看看“应用”使用情况,每行的第一个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主屏幕

此处的“内存使用”日志显示为my,my基于中的代码

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


为什么iOS会终止我的应用程序,即使我很高兴地释放了大量内存来响应内存警告?

没有更多信息,我不知道这些是否适用于您,但在尝试清理内存警告后,我通常会遇到某些问题:

  • 未知循环引用会阻止内存按预期释放。用仪器寻找它们。我最近修复了一个案例,在这个案例中,我意外地在一个块中使用self,导致了一个保留。当出现内存警告时,我们注意到了这一点,我们无法通过释放该资源从警告中恢复
  • 清理资源——或自动释放资源——释放了一些仍然需要的东西。你可能有一个零,你不期望一个,或者你可能会对一个僵尸操作。检查您的保留和清理,特别是学员的清零。打开僵尸和异常断点

通常,最好的解决方案是首先防止内存警告发生。

这是一种针对wrt内存管理等良好做法的一般回答。通常,听起来内存缓存太大了,即使它释放对象以响应内存警告,到那时已经太晚了

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

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

  • 您应该努力使应用程序的内存占用尽可能受到限制。对图像数据使用内存缓存是可以的,但我会限制它的大小。如果你的应用程序占用空间大于250MB,即使你处理了内存警告,它也会被终止。到那时可能太晚了

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


  • 检查图像转换的代码。SDWebImage项目中有一些用于缩小图像的代码,这些代码在选定的图像上应用了一些变换和旋转技术。它实际上并没有用于缩小图像大小,但有时会导致引发内存警告。注释该代码并尝试构建您的应用程序。


    我的应用程序也有同样的问题。我试图对转换代码进行注释。问题解决了。您也可以试一试。

    会出现2级内存警告。在收到2级警告之前,您的应用程序可能会收到一个或多个1级警告,此时您应该采取行动


    根据我的经验,当你的应用程序收到2级警告时,几乎总是为时已晚,而且无论如何都会被杀死。

    处理大图像(每张图像4Mb)时,你可能会面临内存不足的风险,而不会收到内存不足的警告

    最好的办法是防止内存使用量增长过多。图像的加载速度很快,缓存很好,但实际上并不是必需的。最好是在不再使用内存时立即释放内存,以降低使用率


    祝你好运,如果你发现有什么值得分享的,请告诉我们。

    请包括终止日志。其他地方可能有一个不相关的bug。什么是“终止日志”,我如何查看它?打开调试器。当应用程序崩溃时,控制台应该有一条消息,内容是“应用程序因…而终止”,我在Xcode调试器中。“(gdb)”之后根本没有消息——这是最后一个控制台日志。还有什么我需要启用的吗?在仪器中使用分配,模拟内存警告,检查内存是否确实被释放…感谢帮助(投票),但是,这两件事都不是:1)当我释放东西时,你可以看到应用程序的内存使用量实际上在下降,2)这不是僵尸问题,因为iOS肯定要终止我(我可以从我的iPad下载内存不足的“丢弃”崩溃日志)。+1表示3。那儿