Cocoa 如何防止Lion显示崩溃后是否要恢复windows

Cocoa 如何防止Lion显示崩溃后是否要恢复windows,cocoa,crash,osx-lion,restore,Cocoa,Crash,Osx Lion,Restore,每次崩溃后,当我启动应用程序时,lion都会询问我是否希望它还原应用程序窗口,因为上次它没有正确终止,我如何禁用它 背景:我正在为Lion(和Snow Leopard)开发一个可可应用程序,它是一个科学应用程序(不是消费者应用程序,只在内部使用,不在外部分发)。 它与几个硬件接口,并且经常崩溃!(我知道我应该让它不崩溃,但有很多遗留的C代码,没有很好的驱动程序和……) 问题:在每次崩溃后,当我启动应用程序lion时,lion会询问我是否希望它还原应用程序窗口,我如何禁用它 这似乎可行,但没有任何

每次崩溃后,当我启动应用程序时,lion都会询问我是否希望它还原应用程序窗口,因为上次它没有正确终止,我如何禁用它

背景:我正在为Lion(和Snow Leopard)开发一个可可应用程序,它是一个科学应用程序(不是消费者应用程序,只在内部使用,不在外部分发)。
它与几个硬件接口,并且经常崩溃!(我知道我应该让它不崩溃,但有很多遗留的C代码,没有很好的驱动程序和……)


问题:在每次崩溃后,当我启动应用程序lion时,lion会询问我是否希望它还原应用程序窗口,我如何禁用它

这似乎可行,但没有任何文档记录,因此在未来的操作系统更新中可能不起作用:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ApplePersistenceIgnoreState"];

您可以将
NSApplication
子类化,并实现
restorewindowwhidentifier:state:completionHandler:
(另请参见;与NSWindows上的同级方法不同,此方法返回BOOL)。例如,将属性
preventWindowRestoration
添加到NSApplication子类中,以便执行以下操作:

- (BOOL)restoreWindowWithIdentifier:(NSString *)identifier state:(NSCoder *)state completionHandler:(void (^)(NSWindow *, NSError *))completionHandler
{
    if ([self preventWindowRestoration]) return NO;

    return [super restoreWindowWithIdentifier:identifier state:state completionHandler:completionHandler];
}

您最迟需要在
applicationWillFinishLaunching:
中设置属性,因为还原发生在
applicationWillFinishLaunching:
ApplicationIDFinishLaunching:
之间。别忘了在Info.plist中将您的NSApplication子类指定为principal类。

上述答案对我都不起作用(我没有尝试默认的关键技巧,但它似乎不适合生产使用)。以下是对我有效的方法:

在Xcode中,打开故事板的窗口xib并选择NSE窗口

显示实用程序面板(右侧弹出窗口),选择属性检查器(看起来像一个滑动旋钮),然后取消选中“[]可恢复”和“[]启动时可见”

可以为您创建的窗口设置可恢复属性:

NSWindow* window = ...
window.restorable = NO;

我找不到设置window.visible属性的最佳时间,但在xib中设置它对我来说很有用。

来自“忽略现有的可恢复状态(自2011年初以来新增)定义用户默认的ApplePersistenceIgonRepreat时,将忽略现有的可恢复状态和无标题文档。新的可恢复状态和无标题文档自动保存将重定向到临时目录,其路径将记录到控制台。此用户默认值用于希望从干净的环境开始的自动测试“
-restorewindowwhidentifier:…
在Yosemite中并不总是被调用,因此它不能可靠地用于防止恢复。