IOS7中的内存管理和"由于内存压力而终止"

时间:2014-06-17 21:14:47

标签: ios objective-c memory memory-management ios7

我之所以做以下事情的原因是:我有一个GPS跟踪应用程序,应该整天在后台运行。当我将应用程序放在后台时,内存使用量不会下降。当应用程序进入后台时,似乎没有从内存中删除视图...这就是为什么应用程序在正常使用iPhone的几个小时内关闭...从IOS6体验 - 内存使用量应降至cca 8KB。

然后我尝试调试/隔离问题...

我使用UIMapKitView创建了简单的ViewController,以确保视图消耗大量RAM(例如:12-17MB)。当应用程序转到后台应用程序使用相同数量的RAM,直到“由于内存压力终止”消息。仍然 - 有时内存降低到4KB,一切都很好。问题是因为它有点“随机”,应用程序很简单。

我可以手动释放视图占用的RAM吗?例如:set self.view = nil?我应该这样做吗?

我还注意到在杀死app之前并不总是调用“ - (void)didReceiveMemoryWarning”。我希望当操作系统需要更多内存时,它会首先发布视图,而不是让我通过这种方法清除任何内容......这不是有点奇怪吗?

2 个答案:

答案 0 :(得分:1)

Apple重新设计了VC(视图控制器的)视图加载的方式 - 我想说从iOS 5开始? iOS 6?过去,当VC不在最前面且需要内存时,系统会卸载VC的视图。

通过这些更改,VC处于活动状态时,不会卸载VC的视图。 ViewDidLoad仅在VC的生命周期内被调用一次,并且根本不再调用viewDidUnload。

我不知道如果你设置了你的(非最前面的)VC,将会发生什么。内容视图以手动查看。当该视图再次成为最前面时,系统会加载您的视图层次结构吗?您必须尝试一下,但这样做有风险,因为我不认为操作系统的设计方式已经存在了。

如果您的VC视图占用大量内存,您可能需要重新设计应用程序,以便只保留最前面的应用程序,并释放其他VC(保存其状态后。)

Apple并没有让这种应用程序易于编写。相反,他们积极劝阻它。 GPS是一个巨大的耗电量,因此不断地保持它的活动会快速耗尽用户的电池。

我记得在5s听到一个新的位置芯片,它将记录一个" crumb trail"应用程序的位置数据,即使它未运行也是如此。您可能会考虑这一点,尽管它只适用于配备A7芯片和定位芯片的最新设备。

答案 1 :(得分:0)

在我的情况下,问题是具体的IOS7版本。每个应用程序都崩溃了这个版本的操作系统。当我们更新操作系统版本时,一切都开始恢复原状。