objective-c - 为什么 AppKit 在正常的应用程序终止时会破坏我的 "Saved Application State"文件夹?

标签 objective-c xcode macos cocoa appkit

设置:

  • 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 文件夹是正确创建并填充了正确的应用程序状态信息。

Correct Saved Application State Folder Contents

如果我强制退出我的应用程序(通过突然停止正在运行的 Xcode 构建或通过 Dock Force Quit 菜单项),然后重新启动我的应用程序,UI Preservation功能完美。该应用会找到存储在 Saved Application State 文件夹中的信息,并正确地恢复上次运行时打开的 Documents/Windows。

但是,每当我正常退出我的应用程序时,整个 Saved Application State 文件夹都会被删除(我可以在 Finder 中看到这种情况)。因此,下次我启动我的应用程序时,没有要恢复的存储状态,恢复失败。

我追踪到此文件夹删除发生在调用 -[NSApplication terminate:] 之后的某个时间。

所以我在 unlink() 上放置了一个符号断点,果然,AppKit 中的一些代码一个接一个地故意删除了 Saved Application State 文件夹和它的所有内容。

enter image description here

请注意 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/

相关文章:

ios - Swift 圆角在不同的屏幕尺寸上无法正常工作

ios - Xcode UI 测试 - UITableView 部分

c++ - 你如何在 OSX 中使用 QT 设置 OpenCV?

macos - OS X : "man" output giving extra characters when redirected

iphone - CATransiton 闪烁带背景动画

ios - writeToFile :atomically: does not work on iOS 6. 1.3?

ios - 如何在 XCode 6.3 iOS 项目中找到权利 plist 文件

swift - 从集合中引用文本标签查看项目

ios - 如何在 Core Data 中保存有关系的实体

iphone - 如何使用 CAEAGLLayer 淡入淡出 View