设置:
- OS X 10.9.0 (13A603)
- Xcode 版本 5.0.2 (5A3005)
- 普通的基于 Cocoa 文档的应用程序
我开发了一个典型的 Cocoa 基于文档的 OS X 应用程序。
我的意图是支持 Apple 的 User Interface Preservation从应用程序的先前运行中恢复打开的文档/Windows 的功能。
This is supported by default in Document-based apps .
我不会覆盖任何相关方法,例如:
-[NSWindow isRestorable]
-[NSResponder encodeRestorableStateWithCoder:]
-[NSResponder decodeRestorableStateWithCoder:]
-[NSApplication restoreWindowWithIdentifier:state:completionHandler:]
-[NSDocumentController restoreWindowWithIdentifier:state:completionHandler:]
(注意:默认情况下,我的文档窗口中的-[NSWindow isRestorable]
已经返回YES
。大概这是基于文档的应用程序的一个功能)
我不认为我在我的应用程序中做了任何与 UI 保留相关的异常事情。
问题:
我的应用程序中的 UI 保留不起作用。但它以一种非常奇怪的方式失败了。当我运行我的应用程序(通过在 Xcode 中构建和运行它或通过独立运行分发构建)时,正常的 Saved Application State
文件夹是正确创建并填充了正确的应用程序状态信息。
如果我强制退出我的应用程序(通过突然停止正在运行的 Xcode 构建或通过 Dock Force Quit
菜单项),然后重新启动我的应用程序,UI Preservation功能完美。该应用会找到存储在 Saved Application State
文件夹中的信息,并正确地恢复上次运行时打开的 Documents/Windows。
但是,每当我正常退出我的应用程序时,整个 Saved Application State
文件夹都会被删除(我可以在 Finder 中看到这种情况)。因此,下次我启动我的应用程序时,没有要恢复的存储状态,恢复失败。
我追踪到此文件夹删除发生在调用 -[NSApplication terminate:]
之后的某个时间。
所以我在 unlink()
上放置了一个符号断点,果然,AppKit 中的一些代码一个接一个地故意删除了 Saved Application State
文件夹和它的所有内容。
请注意 NSApplicationMain
主线程上名为 NSPersistentUI I/O
的队列对 unlink()
的调用。 (这显然不是来 self 的代码)
为什么 AppKit 在应用程序正常终止时会破坏我的 Saved Application State
文件夹?
这正常吗?
我怎样才能阻止它?
最佳答案
我们覆盖了@indragie 为我们的沙盒应用提到的复选框,因为对于新帐户,该框未被选中,因此关键状态恢复功能丢失。
代码就像将它添加到您的 main() 例程中一样简单:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSQuitAlwaysKeepsWindows"]; // override stupid global preference, so our state restore works properly
关于objective-c - 为什么 AppKit 在正常的应用程序终止时会破坏我的 "Saved Application State"文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199673/