выход вызова (0) в приложении iphone - PullRequest
5 голосов
/ 13 декабря 2011

В какой-то момент в моем приложении я сделал это exit(0), что приводит к сбою приложения.Но я не понял, какой метод вызывается при его выполнении.

Я поместил сообщения в:

(void)applicationWillTerminate:(UIApplication *)application
(void)applicationDidEnterBackground:(UIApplication *)application

Но, похоже, ничего из этого не вызывается!Любая идея о том, какой метод вызывается, когда exit(0) сделано?

Ответы [ 5 ]

19 голосов
/ 13 декабря 2011

Из Руководства пользователя Apple для людей ...

Не выходить программно

Никогда не выходите из приложения iOS программно, потому что люди склонны интерпретировать это как крах. Однако, если внешние обстоятельства мешают ваше приложение функционирует как задумано, вы должны сообщить пользователи о ситуации и объяснить, что они могут с этим поделать. В зависимости от того, насколько серьезна неисправность приложения, у вас есть два выбор.

Покажите привлекательный экран, который описывает проблему и предлагает коррекция. Экран обеспечивает обратную связь, которая заверяет пользователей, что нет ничего плохого в вашем приложении. Это дает пользователям контроль, позволяя им решить, хотят ли они предпринять корректирующие действия и продолжить использование приложения или нажмите кнопку «Домой» и откройте другое приложение

Если не работают только некоторые функции вашего приложения, отобразите либо экран, либо предупреждение, когда люди активируют эту функцию. дисплей предупреждение только тогда, когда люди пытаются получить доступ к функции, которая не функционирование.

Если вы решили, что собираетесь все равно выйти программно ...

В C exit(0) остановит выполнение приложения. Это означает, что никакие методы делегата или обработчики исключений не будут вызваны. Таким образом, если цель состоит в том, чтобы удостовериться, что некоторый код вызывается при закрытии, даже при принудительном закрытии, может быть другой вариант. В вашем AppDelegate реализован пользовательский метод, называемый чем-то вроде -(void)applicaitonIsgoingAway. Вызовите этот метод из любого места, где вы хотите, чтобы ваш код выхода вызывался:

  1. applicationWillTerminate
  2. applicationDidEnterBackground
  3. onUncaughtException

Первые два - это те, которые вы уже упоминали в своем вопросе. Третий может быть универсальным. Это глобальный обработчик исключений. Этот следующий бит взят из вопроса по этой самой теме .

Этот обработчик исключений будет вызываться для любых необработанных исключений (которые в противном случае могли бы привести к сбою вашего приложения). Из этого обработчика вы можете позвонить applicaitonIsgoingAway, как и в двух других случаях. Из другого вопроса, который я упоминал выше, вы можете найти ответ, подобный этому.

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.

8 голосов
/ 13 декабря 2011

Когда вы звоните exit(0), вы немедленно прекращаете свою заявку. 0 - это код состояния, который означает успешное завершение.

Никакой другой метод не вызывается, ваше приложение просто умирает.

Яблоки отговаривают вас звонить куда угодно.

2 голосов
/ 13 декабря 2011

exit(0) - это функция C, которая завершает процесс вашего приложения, поэтому ни один из методов делегатов приложения не будет вызван, приложение будет немедленно уничтожено.Apple настоятельно рекомендует не выходить из приложения, поскольку оно кажется неработоспособным пользователю.

0 голосов
/ 13 декабря 2011

Нет поддерживаемого Apple способа завершить работу вашего приложения программным способом.Звонить по номеру exit, безусловно, не может быть и речи.Это приводит к всевозможным ошибкам (например, многозадачный переключатель плохо работает), а также просто к ошибкам.

Если вы пытаетесь отключить многозадачность, вы можете сделать это с помощью клавиши UIApplicationExitsOnSuspend в вашей информации.plist файл (заголовок для клавиши «Приложение не запускается в фоновом режиме»).

Кроме того, ваши пользователи должны нажать кнопку «Домой», чтобы закрыть приложение.

0 голосов
/ 13 декабря 2011

эти методы будут вызваны, но вы не можете использовать exit (0), вам нужно нажать кнопку назад, чтобы закрыть приложение, тогда эти методы будут называться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...