iOS-NSUserDefaults
NSUserDefaults 简介:
NSUserDefaults用来存储 用户设置 系统配置等一些小的数据。
因为数据是明文存储在 plist 文件中,不安全,即使只是修改一个 key 都会 load 整个文件,数据多加载慢(IO 内存),不适合存储大量数据。
它是单例的,也是线程安全的,是以键值对 key-value 的形式保存在沙盒中
存储路径为:沙盒路径的Library——>Preferences文件夹中
相当于全局的变量
支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。即使对象是NSArray或NSDictionary,他们存储的类型也应该是以上范围包括的。
在进行自定义对象的归档时需要实现NSCoding协议,不实现协议方法则抛出异常,类似于序列化与反序列话,获得的对象都是不一致的。
NSUserDefaults返回的值是不可改变的,即使存储的时候是可变的值。
对相同的Key赋值约等于一次覆盖。
存储数据:
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:@"admin"forKey:@"user_name"];
- setObject:forKey:
- setFloat:forKey:
- setDouble:forKey:
- setInteger:forKey:
- setBool:forKey:
- setURL:forKey:
UIImage *image =[UIImage imageNamed:@"somename"];
NSData *imageData = UIImageJPEGRepresentation(image, 100);
//把image归档为NSData
[userDefault setObject:imageData forKey:@"image"];
[userDefault synchronize];
//保存数据:保存UIcolor类型的,超出上面的5种数据类型,就要进行归档,把它们归档成data类型的数据之后再保存。
NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];
[[NSUserDefaults standardUserDefaults] setObject:objColor forKey:@"myColor"];
//读取数据:
//NSData *objColor = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
//UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];
读取数据:
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault objectForKey:@"user_name"];
- objectForKey:
- URLForKey:
- arrayForKey:
- dictionaryForKey:
- stringForKey:
- stringArrayForKey:
- dataForKey:
- boolForKey:
- integerForKey:
- floatForKey:
- doubleForKey:
- dictionaryRepresentation
移除数据
- removeObjectForKey:
立即写入 synchronize
NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:
[userDefault synchronize];
域的概念以及其用法
在NSUserDefault中存在域的概念,包含5个部分:
- NSArgumentDomain,
- Application,
- NSGlobalDomain,
- Languages,
- NSRegistrationDomain。
NSArgumentDomain:
代表的是命令行参数,可以在Edit Scheme->Arguments->Arguments Passed On Launch中添加,格式是-key value。
Application:
应用程序域,设置的方法默认数据保存是在这里
NSGlobalDomain:
全局域,所有应用程序都将公用该域
Languages:
国际化语言版本域
NSRegistrationDomain:
临时域,- (void)registerDefaults:(NSDictionary*)registrationDictionary方法被调用是数据是保存在这里。
在读取数据时,都会在底层的存储结构中进行一次搜索,搜索的顺序是这样:
NSArgumentDomain->Application->NSGlobalDomain->Languages->NSRegistrationDomain
参考:
https://www.jianshu.com/p/be95cc4a2202
官方文档
https://developer.apple.com/documentation/foundation/nsuserdefaults?language=objc