iOS: Запретить выгрузку фоновой службы определения местоположения, когда система отправляет предупреждение о нехватке памяти

#iphone #ios #memory-management #ios5 #background-process

#iPhone #iOS #управление памятью #ios5 #фоновый процесс

Вопрос:

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

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

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

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

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

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

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

Обновить:

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

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

Я просто должен был осознавать, что мое приложение может быть повторно запущено в фоновом режиме, и должен был использовать [[UIApplication sharedApplication] ApplicationState] для соответствующей обработки этого события.

Ответ №1:

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

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