ios - IOS7和 "Terminated due to Memory Pressure"中的内存管理

标签 ios objective-c memory memory-management ios7

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

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

我使用 UIMapKitView 创建了简单的 ViewController 只是为了确保该 View 消耗大量 RAM(例如:12-17MB)。当应用程序进入后台时,应用程序使用相同数量的 RAM,直到出现“因内存压力而终止”消息。尽管如此 - 有时内存会降低到 4KB,但一切正常。问题是因为它的工作有点“随机”,而且应用程序非常简单。

我可以手动释放 View 占用的 ​​RAM 吗?例如:设置 self.view = nil?我应该这样做吗?

我还注意到“- (void)didReceiveMemoryWarning”并不总是在应用程序被杀死之前调用。我希望当操作系统需要更多内存时,它会首先释放 View ,而不是要求我通过此方法清除可以清除的任何内容...这不是有点奇怪吗?

最佳答案

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

随着更改,VC 的 View 在 VC 处于事件状态时永远不会被卸载。 ViewDidLoad 在 VC 的生命周期中只被调用一次,而 viewDidUnload 根本不再被调用。

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

如果您的 VC View 占用了大量内存,您可能需要重新构建您的应用,以便仅保留最前面的应用,并释放其他 VC(在保存它们的状态后)。

Apple 并没有让这类应用程序易于编写。相反,他们积极阻止它。 GPS 是一个巨大的耗电设备,因此保持它始终处于事件状态会快速耗尽用户的电池电量。

我记得在 5s 中听说过一个新的位置芯片,它会根据你的要求为你的应用记录位置数据的“面包屑痕迹”,即使它没有运行。您可能会研究一下,尽管它只适用于配备 A7 芯片和定位芯片的最新设备。

关于ios - IOS7和 "Terminated due to Memory Pressure"中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24273405/

相关文章:

ios - 在 iOS 7 中,随着客户 VC 转换,是否可以在 presentViewController 之后在屏幕上显示 "fromviewcontroller"?

ios - 在哪里删除 Swift 中 NSNotification 的观察者?

ios - 在 Swift 中访问标签文本

objective-c - 更改 UIView 框架时移动元素

matlab - How to access memory information in Matlab on Unix - 相当于用户view.MaxPossibleArrayBytes

javascript - 如何使用 javascript 或 jQuery 在 Microsoft Edge 中禁用 "swipe to go back"?

objective-c - 是否保证在创建对象的同一线程上调用 dealloc?

ios - UITableView 崩溃,因为 "Attempt to create two animations for cell"(iOS 7)

Java:计算内存使用量时结果不准确

c - SPI 闪存编程问题