iphone - iOS:防止系统发送低内存警告时卸载后台定位服务

标签 iphone ios memory-management ios5 background-process

我有一个在后台运行的位置服务,但我发现有时如果用户在前台运行许多其他应用程序,我的应用程序将被卸载。

使用 Instruments,我的应用目前在后台消耗了大约 1.2MB。具有空 View 的项目在后台消耗大约 600KB。我知道我有一些改进可以使它更接近最小值,但除此之外,我还能做些什么来防止我的应用程序被卸载?由于我的应用程序实际上在后台做一些“有用”的事情,是否有办法向系统表明这一点,以便我的应用程序优先于其他一些暂停的应用程序,例如不需要该内存的游戏?

有谁知道该算法在首先刷新哪些后台应用程序方面是如何工作的?是按内存使用顺序,按前台最旧打开的应用程序,按后台运行最旧的线程?

扩展问题:

在此服务场景中应该做出哪些正确的权衡?我可以将 CLLocation 移动到 AppDelegate 中。我是否应该在每次进入后台时强制我的 ViewController 卸载,这样我的后台内存使用量是绝对最小的,但权衡启动时间并强制重新加载缓存的 map 图 block ?或者我可以等到收到 didReceiveMemoryWarning 后再释放 viewController 吗?

如果我对终止应用程序的顺序有所了解,那将有助于做出正确的权衡。例如,是否有一种循环方法,其中最早挂起的应用程序首先收到警告。然后,如果系统仍然需要更多内存,它会再次出现,它会真正杀死吗?或者系统是否向应用程序发出内存警告,发现没有释放足够的内存并杀死应用程序,然后移动到下一个挂起的应用程序。还是按内存使用量排序?

在此主题上的任何最佳实践将不胜感激。

更新:

在花了半天时间将我的应用程序从 ARC & Storyboard 改回手动分配后,我仍然发现后台内存使用情况大致相同。即使我从 View 中删除所有 View Controller 并释放它们,系统仍然不会立即释放该内存。所以最后我的应用程序被杀死的可能性与我使用 ARC 时一样。更有趣的是,我的应用程序永远不会收到 didRecieveMemoryWarning,我的 viewDidUnload 也永远不会被调用,我的应用程序只是在没有通知的情况下被杀死。

幸运的是,有人在 Apple Developer 论坛上向我指出,如果启用了 MonitoringSignificantLocationChanges,即使我的应用程序被终止,它也会在发生重大位置变化时重新加载。

我只需要意识到我的应用程序可以从后台重新启动,并且必须使用 [[UIApplication sharedApplication] applicationState] 相应地处理该事件。

最佳答案

你无法阻止 iOS 终止你的应用程序,这就是系统的工作方式。 如果出现内存不足警告,iOS 将终止某些在后台运行的应用程序。

提示只是让您的内存使用率尽可能低。

关于iphone - iOS:防止系统发送低内存警告时卸载后台定位服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8090516/

相关文章:

iphone - 使用适用于 iOS 的新 GoogleMaps SDK 找不到文件

iphone - 是否可以在没有Windows或Linux且没有其中一种设备的情况下针对iPhone/iPod Touch进行开发?

ios - 我需要自己释放添加到 NSDictionary 中的 NSNumbers 吗?

iphone - 最大大小仍然适合20MB Appstore限制?

ios - 如何删除 TableView ios 的索引路径中的重复项,

ios - RACCommand单独处理成功完成

memory - PAE(物理地址扩展)如何启用大于 4GB 的地址空间?

java - 优化大型 Java 数据数组的处理和管理

ios - 将 id 传递到另一个屏幕以显示特定的 id - 产品及其详细信息

iphone - iOS:如何确保任务按照使用 NSOperationQueue 排队的顺序执行