Вызов вызова (0) в приложении iphone
В какой-то момент в моем приложении я сделал это exit(0)
который вылетает из моего приложения. Но я не выяснил, какой метод вызывается, когда он выполняется.
Я положил сообщения в:
(void)applicationWillTerminate:(UIApplication *)application
(void)applicationDidEnterBackground:(UIApplication *)application
Но ничего из этого, кажется, не вызывают! Любая идея о том, какой метод вызывается, когда exit(0)
готово?
5 ответов
Из Руководства пользователя Apple для людей...
Не выходите программно
Никогда не закрывайте приложение iOS программно, потому что люди склонны интерпретировать это как сбой. Однако, если внешние обстоятельства не позволяют вашему приложению функционировать должным образом, вам нужно рассказать своим пользователям о ситуации и объяснить, что они могут с этим сделать. В зависимости от серьезности неисправности приложения у вас есть два варианта.
Покажите привлекательный экран, который описывает проблему и предлагает исправление. Экран обеспечивает обратную связь, которая заверяет пользователей, что с вашим приложением все в порядке. Это позволяет пользователям управлять, позволяя им решать, хотят ли они предпринять корректирующие действия и продолжать использовать ваше приложение или нажать кнопку "Домой" и открыть другое приложение.
Если только некоторые функции вашего приложения не работают, отобразите экран или предупреждение, когда люди активируют эту функцию. Отображать предупреждение только тогда, когда люди пытаются получить доступ к функции, которая не работает.
Если вы решили, что вы все равно выйдете программно...
В С, exit(0)
остановит выполнение заявки. Это означает, что никакие методы делегата или обработчики исключений не будут вызваны. Таким образом, если цель состоит в том, чтобы убедиться, что некоторый код вызывается при закрытии, даже при принудительном закрытии, может быть другой вариант. В вашем AppDelegate
реализовать собственный метод, называемый что-то вроде -(void)applicaitonIsgoingAway
, Вызовите этот метод из любого места, где вы хотите, чтобы вызывался ваш код выхода:
applicationWillTerminate
applicaitonDidEnterBackground
onUncaughtException
Первые два - это те, которые вы уже упоминали в своем вопросе. Третий может быть универсальным. Это глобальный обработчик исключений. Следующий бит проистекает из вопроса на эту тему.
Этот обработчик исключений будет вызван для любых неупорядоченных исключений (которые в противном случае могли бы привести к аварийному завершению работы вашего приложения). Из этого обработчика вы можете позвонить applicaitonIsgoingAway
так же, как в других 2 случаях. Из другого вопроса, который я упоминал выше, вы можете найти ответ, похожий на этот.
void onUncaughtException(NSException* exception)
{
[[AppDelegate sharedInstance] applicationIsgoingAway];
}
Но чтобы это работало, вам нужно настроить этот метод как обработчик исключений, например так...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&onUncaughtException);
//There may already be more code in this method.
}
Теперь вы можете выйти из приложения программно, вызвав NSAssert(FALSE, @"Quitting the app programmatically.");
Пока нет другого обработчика исключений, чтобы поймать это, ваше приложение начнет падать, и будет вызван код вашего обработчика исключений. вызов по очереди applicationIsGoingAway
,
Когда вы звоните exit(0)
Вы немедленно прекращаете свою заявку. 0 - это код состояния, который означает успешное завершение.
Никакой другой метод не вызывается, ваше приложение просто умирает.
Яблоки отговаривают вас называть выход где угодно.
exit(0)
является функцией C, которая завершает процесс вашего приложения, поэтому ни один из методов делегатов приложения не будет вызван, приложение будет немедленно уничтожено. Apple настоятельно рекомендует не выходить из приложения, потому что оно кажется неработающим для пользователя.
Не существует поддерживаемого Apple метода для завершения вашего приложения программным способом. призвание exit
безусловно, не может быть и речи. Это приводит к всевозможным ошибкам (например, многозадачный переключатель плохо работает), а также просто к ошибкам.
Если вы пытаетесь отключить многозадачность, вы можете сделать это с помощью UIApplicationExitsOnSuspend
введите файл Info.plist (название ключа "Приложение не запускается в фоновом режиме").
Кроме этого, ваши пользователи должны нажать кнопку "Домой", чтобы закрыть приложение.
Эти методы будут вызваны, но вы не можете использовать exit(0), вам нужно будет нажать кнопку "назад", чтобы закрыть приложение, после чего будут вызваны эти методы.