NSUserDefaults 提供了一个与默认设置交互的接口. 这些默认设置允许一个 App 为每一个单独的用户的设置提供定制化的行为.
我们可以通过 NSUserDefaults 对象在运行时从数据库读取用户的数据, 并添加到缓存中. 在我们正常获取或者设置 NSUserDefaults 的值时, 数据库和缓存中的数据其实并没有同步更新, 因为这样会影响效率. NSUserDefaults 在需要同步时会 自动调用 synchronize 方法更新数据库数据. 我们也可以手动调用 synchronize 来同步数据.
从 NSUserDefaults 中返回的值都是不可变的, 也就是 NSString NSArray NSDictionary . 如果你想要改变这些值, 你需要调用 mutableCopy , 获取不可变的版本, 改变它的值之后再设置 NSUserDefaults 中对应的键.
在 NSUserDefaults 中设置 BOOL 类型的值总会有一个非常麻烦的问题. 如果我们要在 NSUserDefaults 中存储一个 BOOL 类型的值, 当我们使用 boolForKey: 取出它的值时, 它的默认值总是 NO .
因为在你没有为一个 key 单独设置值时, 它的默认值总是 nil . 所以在我们使用 NSUserDefaults 设置一个 BOOL 值时, 总会把这个 BOOL 值的 语义设置为相反 的.
但是当我们需要把 BOOL 值的默认值设置为 YES 时, 其实也是有办法的.
假如我们要为我们的 App 添加一个 isLatestVersion 的 BOOL 值, 而它的默认值是 YES .
static NSString *isLatestVersion = @"isLatestVersion"; 当我们使用 boolForKey: 获取 isLatestVersion 的值时:
[[NSUserDefaults standUserDefaults] boolForKey:isLatestVersion]; 如果我们在之前没有设置它的值, 它的值总是 NO .
但是当我们用 objectForKey: 去获取它的值时:
[[NSUserDefaults standUserDefaults] objectForKey:isLatestVersion]; 它返回的值是 nil . 哪怕在我们先通过 boolForKey: 获取 isLatestVersion 之后, 再调用 objectForKey: 返回的值依然是 nil . boolForKey: 也没有改变它的行为.
也就是说当我们没有设置一个 BOOL 类型的 NSUserDefaults 值时, 它的默认值都是 nil , 这样我们就可以通过下面的代码将一个 BOOL 类型的默认值设置为 YES 了.
if ([[NSUserDefaults standUserDefaults] objectForKey:isLatestVersion] == nil) { [[NSUserDefaults standUserDefaults] setBool:YES forKey:isLatestVersion]; }