NSUserDefaults 适合存储轻量级的不需要加密的本地数据,例如用户的偏好设置、用户名等,NSUserDefaults 肯定是我们的首选。
NSUserDefaults 使用单例模式,在程序中只有一个实例对象,可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。
因为 NSUserDefaults 存储的数据是明文存放在 .plist 文件中,所以不安全,以及只是修改一个 key 都会重新 load 整个文件,数据多加载慢(IO内存),所以不适合存储大量数据。
NSUserDefaults 是以键值对 Key-Value 的形式保存在沙盒中,存储路径为为沙盒路径的 Library -> Preferences 文件夹中。
NSUserDefaults 支持的数据类型:
其中 NSArray 和 NSDictionary 中存储的数据类型也应该在上面的范围内。
//获取NSUserDefaults的单例模式
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSUserDefaults 的使用和 NSMutableDictionary 是一样的。
//存数据
[userDefaults setObject:@"名字" forKey:@"name"];
//取数据
NSString *name = [userDefaults objectForKey:@"name"];
//移除数据
[userDefaults removeObjectForKey:@"name"];
NSUserDefaults 存储的数据类型必须是不可变的,不能存储可变数据的类型,取数据时也不能使用可变类型直接取数据。
如果要存可变类型的数据,需要先将可变类型转为不可变类型,再使用 NSUserDefaults 进行存储。取值时同样需要先使用不可变类型取,再将不可变类型转为可变类型。
NSUserDefaults 立即写入
NSUserDefaults 是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止程序意外退出时 NSUserDefaults 还未将缓存中的数据写入磁盘而导致的数据丢失,可以在写入数据后使用 synchronize 强制立即将数据写入磁盘。
[userDefaults synchronize];
NSUserDefaults 中还提供了很多方便我们使用的方法:
//所有取值的便利方法,从中可以看出NSUserDefaults支持的数据类型
- (nullable NSString *)stringForKey:(NSString *)defaultName;
- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
- (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
- (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
- (NSInteger)integerForKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
//所有存数据的便利方法
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);