applicationWillTerminate不会被调用

时间:2010-12-01 01:55:43

标签: objective-c cocoa macos

我希望在终止之前保存我的数据,因此我的AppControll类符合NSApplicationDelegate协议,并声明了方法;在界面构建器中,我将窗口的委托出口绑定到AppController,但我无法调用该方法。

我错了,我该怎么办?

5 个答案:

答案 0 :(得分:8)

您是否正在终止Xcode的应用程序?或者,您的Info.plist中是否启用了突然终止?

其中任何一个都会导致SIGTERM信号被发送到应用程序,立即终止,NSApplication实例无法向其委托发送applicationWillTerminate:消息。 (这是突然终止的重点:你的应用程序立刻死了。你可以关闭它,然后以编程方式关闭,这会很糟糕。)

尝试在自身内部退出应用程序(“应用程序”菜单中的“退出”菜单项),或使用Dock退出(右键单击应用程序的磁贴并选择“退出”)。只要禁用突然终止(或从未启用),其中任何一个都会导致应用程序对象发送applicationWillTerminate:消息。

同时检查您的代理是否收到了其他应用程序委托消息,例如applicationWillFinishLaunching:,并确保您将插座连接到正确的笔尖(您的MainMenu笔尖)。

答案 1 :(得分:4)

您是否记得将处理程序添加到应用程序中?

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

答案 2 :(得分:2)

多任务处理是否仍然有效?这可能是问题 - 如果应用程序进入后台,点击主页按钮不会导致applicationWillTerminate:被调用。

答案 3 :(得分:1)

applicationWillFinishLaunching:添加:

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

答案 4 :(得分:1)

我假设这个问题适用于macOS应用程序(因为它提到了NSApplicationDelegate)。

默认情况下,Xcode 11(可能还有更早的版本?)在新应用程序的Info.plist文件中包含NSSupportsSuddenTermination属性:

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

此属性与ProcessInfo(NSProcessInfo)类中的enableSuddenTerminationdisableSuddenTermination对方法关联。

ProcessInfo文档的相关部分指出:

突然终止

macOS 10.6及更高版本包括一种机制,该机制允许系统通过注销应用程序(而不是要求自己退出)来更快地注销或关闭。

您的应用程序可以在全球范围内启用此功能,然后在允许突然终止的操作中可能会导致数据损坏或不良用户体验的操作中手动覆盖其可用性。另外,您的应用程序也可以手动启用和禁用此功能。

换句话说,当NSSupportsSuddenTermination为true时,当用户尝试(直接或间接)退出应用程序时,macOS会终止该应用程序,而不是请求其退出。这样可以绕开常规退出请求期间可能触发的所有事件。

一个很好的新功能是,您可以根据应用程序的需要,通过调用Info.plist来禁用ProcessInfo.processInfo.disableSuddenTermination()文件中的文件,或手动覆盖它。