2011-01-10 2 views
2

Итак, я много читаю о том, как iOS обрабатывает уведомления о состоянии приложений, и похоже, что они создали проблему для меня в iOS 4.(iOS 4.x) Очистка NSUserDefaults, когда приложение завершает работу

До 4.x, я очищал свои NSUserDefaults в методе делегата - (void)applicationWillTerminate:(UIApplication *)application {}.

К сожалению, это не похоже, что этот метод больше используется, когда пользователь покидает приложение с рабочего стола (нажимая красный «-»). Вместо этого приложение получает SIGKIL. Кто-нибудь задумал способ захватить это и сделать что-то, когда приложение будет прекращено (например, очистить UserDefaults)? Я бы предпочел не отключать многозадачность, поскольку это нестандартное поведение. Любая помощь вообще будет оценена по достоинству. Благодаря!

ответ

3

Этот метод все равно будет отправлен, если iOS когда-либо решит выйти из приложения. Вероятно, вы должны поместить тот же код очистки в applicationWillResignActive:, если хотите его очистить при перемещении на задний план.

Однако, если вы говорите, что хотите поддерживать многозадачность, почему вы очищаете по умолчанию? Разве пользователь не может вернуться в приложение точно так же, как он его покинул?

+0

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

+0

Я закончил переосмысливать свои структуры данных для решения этой проблемы и пошел с этим путем. Спасибо за помощь. : D – gabaum10

0

Под «чистым» подразумевается «синхронизация с диском»? (т. е. путем вызова -синхронизации)

Если это так, NSUserDefaults автоматически обрабатывает это для вас, не нужно беспокоиться об этом.

+0

синхронизация запускается периодически, однако нет никакой гарантии, что она будет вызвана до того, как ваше приложение будет убито. –

+0

Если ваше приложение не было неожиданно убито (то есть в ответ на давление памяти или из-за сбоя), он будет синхронизироваться с настройками во время завершения. Если это не документально подтвержденная гарантия, она должна быть (возможно, стоит указать ошибку, если это так). Кроме того, «периодически» не совсем правильная формулировка. Это интервал объединения после того, как будет установлен какой-либо префикс. –

+0

Нет, я не хочу, чтобы он синхронизировался. Я хочу удалить некоторые вещи, которые я не хочу сохранять, прежде чем приложение закрывается. Раньше я мог это сделать до 4.x в методе 'applicationWillTerminate'. Но это больше не вызвано ... – gabaum10

0

Вам все еще нужен код в приложенииWillTerminate: для тех устройств iOS 4, которые не поддерживают многозадачность. Но вам также понадобится вызывать тот же код, когда приложение переходит в фоновый режим (applicationDidEnterBackground :). Вы также можете рассмотреть applicationWillResignActive :, но это получило бы вызов при поступлении вызова или SMS, а не только при его поступлении в фоновый режим.

+0

См. Мой ответ на ответ bobDevil. Я не хочу ничего делать с ним, когда он входит в фоновый режим ... – gabaum10

+0

В этом случае единственный вариант - отключить многозадачность ('UIApplicationExitsOnSuspend'), поскольку нет способа перехватить« убить », когда ваше приложение на заднем фоне. –

+0

Ах, человек, это шарик. Невозможно настроить уведомление для прослушивания сообщения SIGKIL? – gabaum10

Смежные вопросы