请有人帮助我:是否强制要求NSUserDefaults
synchronize()
方法?如果我不打电话,会发生什么?没有它,我的应用程序运行正常。
答案 0 :(得分:18)
否强>
自iOS12起,它不再是强制性的。 Apple says:
此方法是不必要的,不应使用。
您可以在iOS12 release note找到更多信息:
<强> UserDefaults 强>
NSUserDefaults有几个错误修复和改进:
删除了同步要求。不再需要使用synchronize,CFPreferencesAppSynchronize或CFPreferencesSynchronize。这些方法将在操作系统的未来版本中弃用。
现在您不需要调用这些同步方法,NSUserDefaults和Preferences Utilities的性能特征略有不同:排队写入操作所花费的时间现在由写入线程支付,而不是由下一个线程支付。调用同步或执行读操作。
答案 1 :(得分:14)
来自docs:
因为此方法是定期自动调用的,所以只有在您不能等待自动同步时(例如,如果您的应用程序即将退出)或者您希望将用户默认值更新为打开时,才使用此方法即使您没有进行任何更改,也可以使用磁盘。
这意味着如果您在某些内容被写入默认值后立即终止该应用程序而没有定期间隔捕获它,那么它将会丢失。你可能没有在写入事件后立即杀死应用程序,这就是为什么你的应用程序到目前为止工作正常。
答案 2 :(得分:3)
通常情况下它完全正常,你只需要在特殊情况下使用它,例如当应用程序在写入NSUserDefaults后直接关闭时。因此,您只需将synchronize方法添加到相应的AppDelegate方法即可。
答案 3 :(得分:3)
正如其他人所说,你通常不必同时调用同步。
通常系统会为您调用它,因此您的默认更改会被写入。
但是,在使用Xcode时,通过按下命令周期或单击停止按钮来终止应用程序是很常见的。在这种情况下,它会在没有警告的情况下终止应用程序,并且您的用户默认更改很可能不会被写出来,并且会丢失。
根据您的需要,这可能是好事还是坏事。这当然令人困惑。
每次进行更改时,或者在某个时间间隔内调用synchronize,都可以“修复”它。然而,这确实会降低您的应用程序速度并增加其功率要求(两者都非常小)。如果您处于循环中,将更改写入10,000个服务器或核心数据记录,并在每次传递后更改用户默认值,然后调用同步后每一个都可能对应用程序速度和电池寿命产生可测量的影响。在大多数情况下,你不太可能注意到差异。