【发布时间】:2011-03-25 10:02:50
【问题描述】:
我正在尝试在 Cocoa 应用程序中实现自定义终止行为。通常,当我的应用程序正常退出时,它会执行最终运行时数据库清理,然后退出。每当调用 [NSApp terminate:aSender] 时,这都会在 AppDelegate(NSApplication 的代表)内部发生:
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
// database cleanup...
return NSTerminateNow;
}
如果在运行时发生错误(例如,数据库文件被删除),我会向用户显示错误,并让他们选择恢复(放回文件并重试)或退出。如果选择了退出,我想退出应用程序跳过数据库清理,因为它不再可能。本质上,我想要这样的东西:
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
BOOL gracefulTermination = ...;
if (gracefulTermination == YES)
{
// Database cleanup....
}
return NSTerminateNow;
}
当然,问题在于获得 gracefulTermination 的值。
有没有办法在调用terminate:时将自定义变量传递给NSApp,例如infoDict,然后在applicationShouldTerminate:内部接收?
如果没有,是否有更好的方法来完成自定义终止行为?
据我所知,当terminate: 被其他对象调用时,会发生这种情况:
-
[NSApp terminate:self];由 foo(又名 self)调用。 - NSApp 发送其委托:
[aDelegate applicationShouldTerminate:self];(self 是 NSApp,而不是 foo)。 - aDelegate 接收消息并执行
applicationShouldTerminate:(如果已实现)。
foo 似乎在某处消失了,当 aDelegate 收到消息时,它已经永远消失了,只有 NSApp 显示为发件人。这可以防止我将 foo 中的 infoDict 或只是一个普通的 infoDict 传递给包含自定义 terminate: 行为的Delegate。
我知道不使用[NSApp terminate:...] 和exit() 之类的东西也可以退出。虽然从我所读到的内容来看,这是不受欢迎的,因为它不适合可可。此外,它还可以防止在 applicationShouldTerminate: 内发生任何其他清理操作,即使在非正常退出期间也不应跳过这些操作。
【问题讨论】:
标签: cocoa terminate nsapplication