NSUserplist创建在Swift中失败(但不是Objective-C)

NSUserplist创建在Swift中失败(但不是Objective-C),objective-c,macos,swift,nsuserdefaults,Objective C,Macos,Swift,Nsuserdefaults,我正在将我的一个项目从Objective-C转换为Swift,我遇到了一个奇怪的障碍。考虑下面的代码(在-Apple中执行)……/P> 目标-C 请原谅我的一行 在我的Objective-C项目中,这项工作与预期相符。如果我第一次运行我的应用程序,并且不存在plist,那么在下一次同步调用期间,默认值将被注册并保存到新的plist中。如果plist已经存在,但缺少一个值,它将从默认值中添加该值。有道理 Swift let defaults = NSUserDefaults.standardUse

我正在将我的一个项目从Objective-C转换为Swift,我遇到了一个奇怪的障碍。考虑下面的代码(在-Apple中执行)……/P> 目标-C

请原谅我的一行

在我的Objective-C项目中,这项工作与预期相符。如果我第一次运行我的应用程序,并且不存在plist,那么在下一次同步调用期间,默认值将被注册并保存到新的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独占项目中,默认值被注册到内存中,但在调用-synchronize时,它们从未写入磁盘。如果我记录了一个值,我可以在执行上述代码后立即测试并验证内存中是否存在默认值

println(defaults.objectForKey("showUnread"))
但是这些值永远不会保存到plist。即使我从接口更新了一个绑定(所有绑定都保存并保持得非常好),也不会为缺少的值保存默认值。事实上,在我更新一个绑定之前,永远不会为我的应用程序创建plist

然而,我的Objective-C项目,几乎是我的Swift项目的逐字翻译,正在完美地工作。我一定忽略了一些简单的东西,但我在谷歌和Stack Overflow上的搜索结果是空的

故障排除步骤

  • 创建了一个新的Swift项目,将Defaults.plist复制到该项目中,并将上述代码放入-applicationdFinishLoading中。完全相同的结果
  • 删除应用缓存和plist,清空垃圾并重新启动
  • 我听说cfprefsd进程可以维护到已删除文件的链接,但是它可以与使用相同包标识符的Objective-C代码配合使用

  • registerDefaults
    的调用从不保存任何数据(以任何一种语言)。当查找一个不存在的值时,这只是一个回退。您对数据应该写入磁盘的期望是不正确的


    调用
    synchronize
    没有任何作用,因为您没有在
    NSUserDefaults

    中设置任何值。我确实知道
    registerDefaults
    没有写入磁盘,但我一直认为它的目的是创建那些不存在的值。如果
    synchronize
    没有将默认值提交给plist,那么
    registerDefaults
    有什么作用?那么为什么Objective-C中的同一代码会将值保存到plist?1)Objective-C代码不会保存注册为默认值的值。如果您有持久化的数据,那么它来自其他代码。2)
    registerDefaults
    的目的是提供一组内存中的值,这些值在给定密钥的实际值尚未保存时使用。在评论之后,我进一步考虑了您的答案,并意识到我问了您已经回答过的一系列问题。因此,我想剩下的唯一问题是,在应用程序首次启动时填充
    NSUserDefaults
    的标准做法是什么?检查无和
    setObject
    ?1)定义“在Objective-C中意外工作”。我在Objective-C应用程序中使用了
    registerDefaults
    ,它不会保留默认值。2) 你没有。无需填充
    NSUserDefaults
    。这就是注册默认值的作用。它允许您定义默认值,而无需将一堆初始值写入磁盘。只有当您有明确的值要保存时才调用
    setObject:
    。如果我删除plist和应用缓存并重建我的应用,然后退出应用程序而不与之交互,它将创建plist,并且我的默认值的内容将保存在中。在我的整个项目中,我没有使用过
    setObject
    。它完全依赖于接口绑定。我不想争论这个问题,因为我意识到我的疏忽很可能出现在我的Objective-C项目中,而不是像我想的那样出现在我的Swift项目中,但它确实看起来很奇怪。启动时与NSUserDefaults的唯一交互是我问题中的代码。
    println(defaults.objectForKey("showUnread"))