iOS NSUserDefaults synchronize存储遇到的坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS NSUserDefaults synchronize存储遇到的坑相关的知识,希望对你有一定的参考价值。

参考技术A ios下可以使用NSUserDefault、NSKeyedArchiver、sqlite、CoreData几种常用的方式来存储数据,其中NSUserDefaults是系统提供用来存储类似用户的配置等这些的数据,后两者用户存储大批量和比较复杂的数据。

NSUserDefault 基本上支持所有的原生数据类型NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等等。如果要存放非常规类型(如图片)或 自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。

通常为保证数据及时存储,我们会使用synchronize 立即同步磁盘的数据的, 这句在使用NSUserDefault会被自动调用,但是很可能不会立即就调用到,建议我们手动调用。

其实即使调用了synchronize后,立即取值有时也会有取值失败的时候,尤其是在存储NSData类型的数据时。(可能是xcode调试的问题)

NSUserDefaults是单例的,同时也是线程安全的。synchronize存储使用了同步锁机制,如存储一张用户头像(图片较大),需要先转为NSdata,再存储,是有延迟的。若立即读取,有可能读取失败。

1、若较大的NSdata数据需要缓存到NSUserDefaults,建议不要立即读取的。
2、通过在使用的类中定义一个属性或 静态字典等临时存储。

直接是对静态字典进行操作,直接setValue:forKey: 存取图片或自定义对象,不会存在延迟问题。

以上是关于iOS NSUserDefaults synchronize存储遇到的坑的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 iOS 中使用 NSUserDefaults?

iOS之NSUserDefaults的用法

iOS:NSUserDefaults 是不是与 iCloud 同步?

如何从 Objective C、iOS 中的 NSUserDefaults 获取准确数据?

无法保存到 iOS 7.0.2 上的 NSUserDefaults

iOS NSUserDefaults 删除