Использование -applicationShouldTerminate:
в вашем делегате NSApplication является правильным решением.
Однако для приложений, построенных на Mac OS X 10.6 и более поздних версиях, есть функция под названием Sudden Termination, с которой вы, вероятно, сталкиваетесь,Это довольно просто описано в Foundation Release Notes .
В результате ваши фоновые задачи должны предотвращать внезапное завершение:
- (void)longRunningTask {
NSProcessInfo *processInfo = [NSProcessInfo processInfo];
[processInfo disableSuddenTermination];
// real task work
[processInfo enableSuddenTermination];
}
Таким образом, ваше приложение будетотправляется -terminate:
соответствующим образом, когда вы просите его выйти, когда он занят, что, в свою очередь, вызывает -applicationShouldTerminate:
вашего делегата NSApplication, что позволит вам корректно остановить ваши задачи или попросить пользователя отменить их.
Если вы выполняете свои долгосрочные задачи в NSOperation или его подклассе, было бы хорошо просто добавить эту поддержку в общем, а не добавлять ее ко всем вашим задачам по отдельности.(Не забудьте снова включить внезапное завершение независимо от того, как ваша задача останавливается, завершается ли она или отменяется.)