gpt4 book ai didi

objective-c - NSUserDefaults Plist 在 Swift 中创建失败(但不是 Objective-C)

转载 作者:可可西里 更新时间:2023-11-01 01:40:08 25 4
gpt4 key购买 nike

我正在将我的一个项目从 Objective-C 转换为 Swift,但我遇到了一个奇怪的障碍。考虑以下代码(在 -applicationDidFinishLaunching 中执行)...

Objective-C

请原谅凌乱的一行

[[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];

在我的 Objective-C 项目中,这按预期工作。如果我第一次运行我的应用程序并且不存在 plist,则在下一个 -synchronize 调用期间注册默认值并将其保存到新的 plist 中。如果 plist 已经存在但缺少一个值,它将从默认值中添加该值。有道理。

swift

let defaults = NSUserDefaults.standardUserDefaults()
let plist = NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
defaults.registerDefaults(NSDictionary(contentsOfFile: plist!) as! [NSObject : AnyObject])
defaults.synchronize()

在我的 Swift-exclusive 项目中,默认值被注册到内存中,但当调用 -synchronize 时它们永远不会写入磁盘。如果我记录一个值,我可以在执行上面的代码后立即测试并验证内存中是否存在默认值...

println(defaults.objectForKey("showUnread"))

但是这些值永远不会保存到 plist 中。即使我从界面更新我的绑定(bind)之一(所有这些都保存并完美保存),也不会为缺失值保存默认值。事实上,在我更新我的绑定(bind)之一之前,永远不会为我的应用程序创建 plist。

然而,我的 Objective-C 项目(几乎是对我的 Swift 项目的逐字翻译)运行完美。我一定是忽略了一些简单的事情,但我在 Google 和 Stack Overflow 上的搜索结果是空的。

故障排除步骤

  1. 新建一个Swift项目,将Defaults.plist复制到项目中,将上面的代码放在-applicationDidFinishLoading中。完全相同的结果。
  2. 已删除应用缓存和 plist,清空垃圾并重新启动。
  3. 我听说 cfprefsd 进程可能会维护指向已删除文件的链接,但它与使用相同包标识符的 Objective-C 代码配合得很好。

最佳答案

registerDefaults 的调用从不保留任何数据(无论哪种语言)。这只是查找不存在的值时的后备。您认为数据应该写入磁盘的期望是不正确的。

您对 synchronize 的调用没有执行任何操作,因为您尚未在 NSUserDefaults 中设置任何值。

关于objective-c - NSUserDefaults Plist 在 Swift 中创建失败(但不是 Objective-C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30469562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com