如何在Cocoa中实现自定义非应用程序终止:行为?

如何在Cocoa中实现自定义非应用程序终止:行为?,cocoa,terminate,nsapplication,Cocoa,Terminate,Nsapplication,我正在尝试在Cocoa应用程序中实现自定义终止行为。通常,当我的应用程序正常退出时,它会执行最终的运行时数据库清理,然后退出。每当调用[NSApp terminate:aSender]时,AppDelegate(应用程序的委托)内部就会发生这种情况: - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { // database cleanup... return NS

我正在尝试在Cocoa应用程序中实现自定义终止行为。通常,当我的应用程序正常退出时,它会执行最终的运行时数据库清理,然后退出。每当调用
[NSApp terminate:aSender]
时,AppDelegate(应用程序的委托)内部就会发生这种情况:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    // database cleanup...
    return NSTerminateNow;
}
如果在运行时发生错误(例如,数据库文件被删除),我会向用户显示错误,并给他们恢复(将文件放回并重试)或退出的选项。如果选择退出,我想退出应用程序,同时跳过数据库清理,因为这不再可能。本质上,我想要这样的东西:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    BOOL gracefulTermination = ...;

    if (gracefulTermination == YES)
    {
        // Database cleanup....
    }

    return NSTerminateNow;
}
当然,问题是获取优雅终止的值

当调用
terminate:
时,是否有方法将自定义变量传递给
NSApp
,例如infoDict,然后在
应用程序中接收该变量应终止:

如果没有,是否有更好的方法来完成自定义终止行为


据我所知,当其他对象调用
terminate:
时,会发生以下情况:

  • [NSApp终止:self]由foo调用(又称self)
  • NSApp发送其委托:
    [aDelegate应用程序应终止:self](self是NSApp,而不是foo
  • aDelegate接收消息并执行
    应用程序应终止:
    (如果已实现)
  • foo似乎在某个地方消失了,当aDelegate收到消息时,消息就消失了,只有
    NSApp
    显示为发件人。这可以防止我将foo内部的infoDict或普通infoDict传递给包含自定义
    terminate:
    行为的eLegate



    我知道可以不使用类似于
    exit()
    [NSApp terminate:…]
    退出。虽然从我所读到的,这是不赞成的,因为它不是犹太可可。此外,它还可以防止任何其他清理操作在
    应用程序内部发生。shouldTerminate:
    ,这些操作即使在非正常退出时也不应被跳过。

    理想的解决方案是以应用程序委托人可以判断是否允许终止的方式构造应用程序

    假设您的应用程序委托无法以任何其他方式访问此信息(例如,哪个对象触发的终止会影响是否会发生),这似乎是最简单的解决方案:子类NSApplication,给它一个
    terminationInfo
    属性,并覆盖
    terminate:
    设置此属性并调用super。

    非常感谢Chuck.)你让我朝着正确的方向思考。我最终在AppDelegate中创建了“gracefulTermination”变量。我可以通过使用[NSApp delegate],调用[AppDelegate setGracefulTermination:NO],然后调用[NSApp terminate:self]来访问AppDelegate。当AppDelegate获得applicationShouldTerminate:message时,它现在就知道如何操作了。除非有人想出更好的答案,否则我会在24小时内把你的答案标为正确。再次感谢!