NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"xxxxxxxx" forKey:@"name"];
[defaults synchronize];
我需要知道为什么我必须使用上面代码[defaults synchronize]
的最后一行?使用它的目的是什么?这是必须的吗?
答案 0 :(得分:95)
[default synchronize];
的目的是使用户默认值立即写入磁盘 。你不需要明确地调用它,iOS已经在适当的时候完成它。所以你可以删除该行。实际上,如果每次设置默认值时都调用synchronize
,则会出现性能问题。
在iOS 7之前,当应用程序转换为后台时,用户默认值始终是同步的。从iOS 7开始,情况已经不再如此,因此您可能需要在应用代理synchronize
中调用applicationDidEnterBackground:
或注册UIApplicationDidEnterBackgroundNotification
通知来执行此操作。
来自the documentation for -[NSUserDefaults synchronize]
:
因为此方法是定期自动调用的,所以只有在您不能等待自动同步时(例如,如果您的应用程序即将退出)或者您希望将用户默认值更新为打开时,才使用此方法即使您没有进行任何更改,也可以使用磁盘。
答案 1 :(得分:14)
您不必再写那行了。
更新后的documentation
中的方法参考等待默认数据库的任何挂起的异步更新 并返回;这种方法是不必要的,不应该使用。
对解释该怎么做的方法的评论。
/*!
-synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.
-synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for previous uses of -synchronize depend on what the intent of calling synchronize was. If you synchronized...
- ...before reading in order to fetch updated values: remove the synchronize call
- ...after writing in order to notify another program to read: the other program can use KVO to observe the default without needing to notify
- ...before exiting in a non-app (command line tool, agent, or daemon) process: call CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication)
- ...for any other reason: remove the synchronize call
*/
open func synchronize() -> Bool
答案 2 :(得分:5)
是的,使用该行,您告诉系统使用新的默认值上传NSUserDefaults。
您可以在此处找到所有信息:
答案 3 :(得分:0)
在 iOS 12 发行说明(https://developer.apple.com/documentation/ios_ipados_release_notes/ios_12_release_notes/foundation_release_notes?language=objc)中,您可以找到以下信息:
NSUserDefaults has several bug fixes and improvements:
Removed synchronization requirements. It's no longer
necessary to use synchronize, CFPreferencesAppSynchronize,
or CFPreferencesSynchronize. These methods will be deprecated
in a future version of the OS.
因此,如果您使用 iOS 12 和更高版本定位设备,则根据上述发行说明,它应该可以正常工作而无需调用同步功能。但是,如果您仍然支持 iOS 11 及更低版本,则可能仍需要调用syncize方法。