在同步完成之前iOS NSUserDefaults访问

如果我设置了一个NSUserDefault对象,并在它被同步之前尝试访问它,我将能够访问我刚刚添加的对象吗?

我已经尝试编写代码来testing它,但是我不确定是否在没有我知道的情况下发生了同步

是的,如果在应用程序的同一个运行会话期间发生读取周期之前保存,则应用程序可以在synchronize发生之前访问保存的首选项。 为了在随后的应用程序启动期间访问信息,有必要进行同步。

从Apple文档: NSUserDefaults

NSUserDefaultscaching信息以避免每次需要默认值时打开用户的默认数据库。 同步方法会按周期自动调用,使内存中的caching与用户的默认数据库保持同步。

同步方法将对内存中caching的任何修改写入磁盘( Library/Preferences plist文件),并将未修改的内存中caching更新为磁盘上最新的caching。 这个方法被定期的调用,而没有通知应用程序。

再次从文档: [NSUserDefaults synchronize]

讨论
因为此方法是定期自动调用的,所以只有当您不能等待自动同步(例如,如果您的应用程序即将退出),或者如果要将用户默认更新为磁盘上的内容你没有做任何改变。

根据我的经验,应用程序要退出时显式调用synchronize方法,这可以确保在下次启动时可以使用最新的首选项。 不过,我也碰到过应用程序在synchronize发生之前崩溃的情况,所以pref不被存储。 您的应用程序必须能够处理这些情况。

额外
使用NSUserDefaults来存储最小的数据,不要存储大量的数据。 原因是,应用程序默认值在应用程序启动期间被加载,如果要加载的数据是巨大的,那么应用程序加载时间增加,并且应用程序可能被Springboard杀死。

[NSUserDefault synchronize];的目的[NSUserDefault synchronize]; 是让用户默认写入磁盘立即。

关于这个:

我不确定是否在没有我知道的情况下进行同步。

你不需要明确地调用[NSUserDefault synchronize]来存储值,iOS已经在适当的时候(比如进入后台时)做到这一点。 所以你可以避免这一行,除非你想立即存储这个值。 实际上,如果每次设置一个值时都调用同步,则会导致性能问题。