applicationWillTerminate не вызывается

Я хочу сохранить свои данные до завершения, поэтому мой AppControll класс соответствует NSApplicationDelegate протокол и объявленный метод; и в построителе интерфейса я привязал выход делегата окна к AppController, но я не могу вызвать метод.

Где я не прав, что мне делать?

4 ответа

Решение

Вы не забыли добавить обработчик в приложение?

UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] 
   addObserver:self
   selector:@selector(applicationWillTerminate:)
   name:UIApplicationWillTerminateNotification object:app];

Вы заканчиваете приложение из XCode? Кроме того, включено ли внезапное завершение в вашем Info.plist?

Любой из них вызовет SIGTERM сигнал для отправки приложению, немедленно прерывающий его, без возможности для экземпляра NSApplication отправить его делегату applicationWillTerminate: сообщение. (Это момент внезапного прекращения: ваше приложение мгновенно умирает. Вы можете выключить и включить его программно для случаев, когда это будет плохо.)

Попробуйте выйти из приложения внутри себя (пункт меню "Выход" в меню "Приложение") или с помощью Dock, чтобы выйти из него (щелкните правой кнопкой мыши плитку приложения и выберите "Выход"). Пока внезапное завершение отключено (или никогда не было включено), любой из них заставит объект приложения отправить applicationWillTerminate: сообщение.

Также убедитесь, что вашему делегату отправляются другие сообщения делегата приложения, такие как applicationWillFinishLaunching:и убедитесь, что вы подключили розетку в правильном наконечнике (своем наконечнике MainMenu).

Многозадачность все еще включена? Это может быть проблемой - нажатие кнопки домой не вызывает applicationWillTerminate: быть вызванным, если приложение уходит в фоновый режим.

Я предполагаю, что этот вопрос относится к приложениям macOS (поскольку в нем упоминается NSApplicationDelegate).

По умолчанию Xcode 11 (и, возможно, более ранние версии?) Включает NSSupportsSuddenTermination недвижимость в новых приложениях ' Info.plist файл:

  ...
  <key>NSSupportsSuddenTermination</key>
  <true/>
  ...

Это свойство связано с enableSuddenTermination а также disableSuddenTerminationпара методов в ProcessInfo класса (NSProcessInfo).

В соответствующей части документации ProcessInfo говорится:

Внезапное прекращение

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

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

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

Хорошая новость в том, что вы можете отключить это в Info.plist файл или вручную переопределите его в соответствии с потребностями вашего приложения, вызвав ProcessInfo.processInfo.disableSuddenTermination().

В applicationWillFinishLaunching: добавлять:

[[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(applicationWillTerminate:)
    name:UIApplicationWillTerminateNotification object:nil];
Другие вопросы по тегам