iOS开发-NSUserDefaults使用

申颖逸
2023-12-01

NSUserDefaults

NSUserDefaults 适合存储轻量级的不需要加密的本地数据,例如用户的偏好设置、用户名等,NSUserDefaults 肯定是我们的首选。

NSUserDefaults 使用单例模式,在程序中只有一个实例对象,可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。

因为 NSUserDefaults 存储的数据是明文存放在 .plist 文件中,所以不安全,以及只是修改一个 key 都会重新 load 整个文件,数据多加载慢(IO内存),所以不适合存储大量数据。

NSUserDefaults 是以键值对 Key-Value 的形式保存在沙盒中,存储路径为为沙盒路径的 Library -> Preferences 文件夹中。

NSUserDefaults 支持的数据类型:

  • BOOL
  • NSNumber
  • NSString
  • NSDate
  • NSURL
  • NSArray
  • NSDictionary

其中 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];

注意

  • 对相同的 key 赋值等于覆盖,要保证 key 的整个项目的唯一性,所以使用加前缀的意思完整的长命名是一个不错的方法。
  • NSUserDefaults 存储的对象必须是不可变的(这一点非常关键,弄错的话程序会crash)。
  • 千万不要使用 NSUserDefaults 存储密码、APIKey 或 token 等重要的敏感数据。

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);

 

 类似资料: