2009-11-05 1 views
1

У меня есть код, который необходимо запустить, когда приложение завершается. Я зарегистрировал свой контроллер для NSApplicationWillTerminateNotification следующим образом:NSApplicationWillTerminateNotification не получен

[[NSNotificationCenter defaultCenter] 
    addObserver: self 
     selector: @selector(applicationWillTerminate:) 
      name: NSApplicationWillTerminateNotification 
     object: nil]; 

Теперь, если я начну мое приложение и бросить его в течение первых 20 секунд или около того, applicationWillTerminate вызывается. Если я уйду позже, это не так. Что в моем приложении может вызвать такое поведение? Я также попытался настроить мой контроллер как делегат NSApplication с теми же результатами. Есть идеи?

Спасибо.

О, и это XCode 3.2, Snow Leopard 10.6.1, используя 10.5 SDK. Происходит в сборках Debug и Release.

ответ

5

Существует несколько причин, почему это может произойти.

Если вы используете GC'd, ваш наблюдатель будет собран и финализирован до завершения? (Я должен проверить это и подать сообщение об ошибке, если это произойдет по крайней мере для документирования)

Является ли ваше приложение бесшумным сбоем или вызовом exit() напрямую?

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

Кроме того, в Snow Leopard есть функция, называемая внезапным завершением, что позволяет вашему приложению позволять системе знать, что можно убить приложение, а не проходить обычную терминацию rigamarole. Он задокументирован в документации NSProcessInfo.

+0

Да, это поведение было вызвано функцией «внезапного прекращения». В моем Info.plist включен NSSupportsSuddenTermination. Большое спасибо! – svintus