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];