为什么AppKit在正常的应用程序终止时会破坏我的"已保存的应用程序状态"文件夹?

Tod*_*orf 8 macos xcode cocoa objective-c appkit

设置:

  • OS X 10.9.0(13A603)
  • Xcode版本5.0.2(5A3005)
  • 普通Cocoa基于文档的应用程序

我开发了一个典型的基于 Cocoa Document的OS X应用程序.

我的目的是支持Apple的用户界面保留功能,以便从以前的应用程序运行中恢复打开的Documents/Windows.

默认情况下,基于文档的应用程序支持此功能.

没有压倒任何相关的方法,例如:

-[NSWindow isRestorable]

-[NSResponder encodeRestorableStateWithCoder:]
-[NSResponder decodeRestorableStateWithCoder:]

-[NSApplication restoreWindowWithIdentifier:state:completionHandler:]
-[NSDocumentController restoreWindowWithIdentifier:state:completionHandler:]
Run Code Online (Sandbox Code Playgroud)

(注意:-[NSWindow isRestorable]在我的文档窗口中YES,默认情况下已经返回.大概这是基于文档的应用程序的一项功能)

在我的与UI Preservation相关的应用程序中,我认为我没有做任何与众不同的事情.

问题:

我的应用程序中的UI保留无效.但它以一种非常奇怪的方式失败了.当我运行我的应用程序时(通过在Xcode中构建和运行它或通过独立运行分发版本),Saved Application State正确创建普通文件夹并使用正确的应用程序状态信息填充.

更正保存的应用程序状态文件夹内容

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

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

我跟踪了这​​个文件夹删除,直到-[NSApplication terminate:]调用后的某个时间发生.

所以我放了一个符号断点unlink(),当然,AppKit中的一些代码是故意删除Saved Application State文件夹及其所有内容.

在此输入图像描述

请注意unlink()来自NSPersistentUI I/O主线程上调用的队列的调用NSApplicationMain.(这显然不是来自我的代码)

为什么AppKit会Saved Application State在正常的应用终止时销毁我的文件夹?

这是正常的吗?

我怎么能阻止这个?

Wil*_*ley 14

我们覆盖了沙盒应用程序的@indragie提及复选框,因为对于新帐户,该框未被选中,因此关键状态恢复功能将丢失.

代码就像将其添加到main()例程一样简单:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSQuitAlwaysKeepsWindows"]; // override stupid global preference, so our state restore works properly
Run Code Online (Sandbox Code Playgroud)


ind*_*gie 10

确保在"系统偏好设置">"常规"中取消选中此框:

退出应用程序时关闭窗口

选中此框时,它会禁用状态恢复系统范围并导致您描述的行为.

  • 坏消息:我是个白痴.好消息:我没有"修复"我的应用程序.:) (3认同)