iOS: предотвращение выгрузки фоновой службы местоположения, когда система отправляет предупреждение о нехватке памяти - PullRequest
1 голос
/ 11 ноября 2011

У меня работает служба определения местоположения в фоновом режиме, но я обнаруживаю, что иногда, если пользователь запускает ряд других приложений на переднем плане, мое приложение будет выгружено.

Использование инструментов мое приложениев настоящее время потребляет около 1,2 МБ в фоновом режиме.Проект с пустым представлением потребляет около 600 КБ в фоновом режиме.Я знаю, что есть некоторые улучшения, которые можно сделать, чтобы приблизить это к минимуму, но помимо этого, есть ли что-то еще, что я могу сделать, чтобы предотвратить загрузку моего приложения?Поскольку мое приложение на самом деле делает что-то «полезное» в фоновом режиме, есть ли способ указать это системе, чтобы мое приложение получило предпочтение какому-либо другому приостановленному приложению, такому как игра, которая не нуждается в этой памяти?

Кто-нибудь знает, как работает алгоритм с точки зрения того, какие фоновые приложения сначала удаляются?Это порядок использования памяти, самым старым открытым приложением на переднем плане, самым старым потоком выполнения в фоновом режиме?

Чтобы расширить вопрос:

Каковы правильные компромиссы длябыть сделан в этом сценарии обслуживания?Я могу переместить свою CLLocation в AppDelegate.Должен ли я заставить свой ViewController выгружаться каждый раз, когда он входит в фоновый режим, так что мое использование фоновой памяти является абсолютным минимумом, но требует времени запуска и принудительной перезагрузки кэшированных фрагментов карты?Или я могу подождать, пока я получу didReceiveMemoryWarning, прежде чем выпускать viewController?

Если бы у меня было какое-то чувство порядка, в котором приложения будут убиты, это помогло бы сделать правильный компромисс.Например, существует ли циклический подход, при котором самое старое приостановленное приложение получает предупреждение первым.Затем, когда снова придет в голову, если системе все еще нужно больше памяти, она действительно убивает?Или система выдает предупреждение о памяти приложению, видит, что недостаточно освобождено и затем убивает приложение, затем переходит к следующему приостановленному приложению.Или это порядок использования памяти?

Буду признателен за любые рекомендации по этому вопросу.

Обновление:

Потратив полдня на конвертацию моего приложения из ARC &Возвращаясь к распределению вручную, я все же обнаружил, что использование фоновой памяти было примерно таким же.Несмотря на то, что я удалил все контроллеры представления из представления и освободил их, система все еще не освобождает эту память немедленно.Так что, в конце концов, мое приложение было так же вероятно убито, как и при использовании ARC.Что еще более интересно, мое приложение никогда не получает didRecieveMemoryWarning и мое viewDidUnload никогда не вызывается, мое приложение просто убивается без уведомления.

К счастью, на форуме разработчиков Apple мне было указано, что если MonitoringSignificantLocationChanges включен дажеесли мое приложение будет убито, оно будет перезагружено при значительном изменении местоположения.

Мне просто нужно было знать, что мое приложение может быть перезапущено из фона, и ему пришлось использовать [[UIApplication sharedApplication] applicationState] дляобработать это событие соответственно.

1 Ответ

2 голосов
/ 11 ноября 2011

Ну, вы не можете помешать iOS убить ваше приложение, просто так работает система.Если появляется предупреждение о нехватке памяти, iOS завершит работу некоторых приложений, работающих в фоновом режиме.

Советы позволяют максимально снизить использование памяти.

...