NSUserDefaults 不可靠?

Posted

技术标签:

【中文标题】NSUserDefaults 不可靠?【英文标题】:NSUserDefaults unreliable? 【发布时间】:2016-04-13 08:33:58 【问题描述】:

我正在使用 NSUserDefaults 在我的应用程序中存储键/值对。下面是示例代码:

override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(animated)
    let ud = NSUserDefaults.standardUserDefaults()
    if !(ud.boolForKey("launched_before")) 
        print("first_launch")
        ud.setBool(true, forKey: "launched_before")
     else 
        print("not_first_launch")
    

第一次启动应用程序时,它会按预期打印“first_launch”,第二次启动应用程序时,它也会按预期打印“not_first_launch”。但是,如果我在几次(可能 4 到 20 次)后按 Xcode 中的停止和运行按钮继续重新启动应用程序,boolForKey("launched_before") 将返回 false,这是错误的。 我正在我的设备(iPhone 6、ios 9.3.1)和 Xcode 7.3 上进行测试。 谁能帮帮我?

【问题讨论】:

【参考方案1】:

NSUserDefaults 确实保存不可靠,更糟糕的是您只是通过 Xcode 停止/运行来终止它。

调用NSUserDefaults.StandardUserDefaults().synchronize 将保存数据。

【讨论】:

但是怎么第二次就按预期工作了,也就是说设置boolean是成功的吧? 这将帮助您了解 NSUserDefault 它是如何工作的:accella.net/knowledgebase/… @SuhasPatil 感谢您的链接,但它没有解决我的问题,为什么它在我第二次运行它时运行良好,但在后续运行中可能会失败。我不认为不调用 synchronize() 是问题的原因。因为我第二次运行它,boolForKey() 返回的是正确的 true,并且在随后的运行中保持正确,直到几次之后它突然返回 false。 是的,我明白了,我认为该值不会立即反映在内存中,除非并且直到您没有调用同步,直到那时它保留在缓存内存中,当它被清除时,相应的值是也消失了!

以上是关于NSUserDefaults 不可靠?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 7 NSUserDefaults 变成零

NSUserDefaults 不可靠?

NSUserDefaults,不可靠?

iOS 8 beta 5 中的今日扩展的 NSUserDefaults 是不是被破坏?

检测启动后首次打开应用程序的时间

写入 NSUserDefault 和 .plist 失败