1

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

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

4

2 回答 2

7

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

来自 Apple 文档:NSUserDefaults

NSUserDefaults 缓存信息以避免每次需要默认值时都必须打开用户的默认数据库。同步方法会定期自动调用,它使内存中的缓存与用户的默认数据库保持同步。

synchronize方法会将对内存缓存的任何修改写入磁盘(plist 文件 in Library/Preferences)并将未修改的内存缓存更新为磁盘上的最新内容。此方法会定期调用,而不会通知应用程序。

再次来自文档:[NSUserDefaults synchronize]

讨论
因为这个方法是定期自动调用的,所以只有当你不能等待自动同步(例如,如果你的应用程序即将退出)或者你想更新用户默认值到磁盘上的内容时才使用这个方法尽管您没有进行任何更改。

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

附加
使用 NSUserDefaults 存储最小数据,不要存储大量数据。原因是,应用程序默认值是在应用程序启动期间加载的,如果要加载的数据很大,则应用程序加载时间会增加,并且应用程序很可能被Springboard.

于 2013-06-19T05:28:26.190 回答
0

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

关于这一点:

我不确定同步是否在我不知情的情况下发生。

您不需要[NSUserDefault synchronize]显式调用来存储值,iOS 已经在适当的时间(例如进入后台时)执行此操作。因此,除非您想立即存储该值,否则您可以避免使用该行。实际上,如果每次设置值都调用 synchronize 是性能问题。

于 2013-06-19T05:11:56.727 回答