【发布时间】:2015-08-08 18:39:34
【问题描述】:
我正在将我的一个项目从 Objective-C 转换为 Swift,但遇到了一个奇怪的问题。考虑以下代码(在 -applicationDidFinishLaunching 中执行)...
Objective-C
请原谅凌乱的单行字
[[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];
在我的 Objective-C 项目中,这按预期工作。如果我第一次运行我的应用程序并且不存在 plist,则在下一次 -synchronize 调用期间注册默认值并将其保存到新的 plist 中。如果 plist 已经存在但缺少某个值,它将从默认值中添加该值。有道理。
斯威夫特
let defaults = NSUserDefaults.standardUserDefaults()
let plist = NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
defaults.registerDefaults(NSDictionary(contentsOfFile: plist!) as! [NSObject : AnyObject])
defaults.synchronize()
在我的 Swift 专有项目中,默认值被注册到内存中,但在调用 -synchronize 时它们永远不会写入磁盘。如果我记录一个值,我可以在执行上述代码后立即测试并验证内存中是否存在默认值...
println(defaults.objectForKey("showUnread"))
但是这些值永远不会保存到 plist 中。即使我从界面更新了我的一个绑定(所有这些都可以很好地保存和持久化),也不会为缺失值保存默认值。事实上,在我更新我的一个绑定之前,永远不会为我的应用程序创建 plist。
然而,我的 Objective-C 项目,几乎是我的 Swift 项目的逐字翻译,运行良好。我一定是忽略了一些简单的事情,但是我在 Google 和 Stack Overflow 上的搜索都是空的。
故障排除步骤
- 新建一个Swift项目,将Defaults.plist复制到项目中,并将上述代码放在-applicationDidFinishLoading中。结果完全相同。
- 已删除应用缓存和 plist,清空垃圾箱并重新启动。
- 我听说 cfprefsd 进程可能会维护指向已删除文件的链接,但它可以在使用相同包标识符的 Objective-C 代码中正常工作。
【问题讨论】:
标签: objective-c macos swift nsuserdefaults