1、NSUserDefault——官方文档
NSUserDefaults类提供了访问常见类型(如float,double,int,bool和URL)的便捷方法。一个默认对象必须是一个属性列表 - 也就是,一个实例(或集合,实例的组合):NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存储任何其他类型的对象,则通常应将其存档以创建NSData的实例。有关更多详情,请参阅首选项和设置编程指南。
注意:当我们需要保存一个集合类型时,比如NSArray,数组里保存的数据也必须是以上的类型,不能是其他类型。
2、简单使用
//NSUserDefaults是一个单例,获取对象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//存储一个对象类型
[userDefaults setObject:@"Trump" forKey:@"president"];
//取出一个对象类型
NSString *tump = [userDefaults objectForKey:@"president"];
NSLog(@"%@", tump);
//存储一个bool类型
[userDefaults setBool:YES forKey:@"isPoor"];
//取出一个bool值
BOOL isPoor = [userDefaults boolForKey:@"isPoor"];
NSLog(@"%d", isPoor);
//NSUserDefaults只能处理NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary这几种类型,假如我们要存储一个UIImage,则要先将其转换成NSData
UIImage *image = [UIImage imageNamed:@"meinv"];
//将图片归档为NSData
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
//存储imageData
[userDefaults setObject:imageData forKey:@"imgage"];
//取出Data
NSData *getImageData = [userDefaults objectForKey:@"image"];
//Data转成图片
UIImage *getImage = [UIImage imageWithData:getImageData];
另外还有一些其他常用的API
//从字面意思就能明白
- setFloat:forKey:
- setInteger:forKey:
- setDouble:forKey:
- setURL:forKey:
3、registerDefaults:的使用
- 在我们使用NSUserDefaults时会遇到一些特殊的情况,比如以下代码:
BOOL isRMB = [userDefaults boolForKey:@"isRMB"];
我们没有设置isRMB的值,直接去取,这样它的返回结果是0,但是我们并不能确定它是真的NO,还是no value。这个问题很尴尬,我们可以用objectForKey: 解决这个问题,但是用registerDefaults:可以更好的解决这个问题。
//此方法参数是一个字典,功能就是给isRMB这个key注册一个默认的值
//由于此方法不会将值存储到磁盘上了,所以这个方法要在程序启动的时候调用也就是在application didFinishLaunchingWithOptions:方法中调用
[userDefaults registerDefaults:@{@"isRMB" : @(YES)}];
//这样再去取isRMB这个key对应的值时就不会出现返回值为no value的情况了
BOOL isRMB = [userDefaults boolForKey:@"isRMB"];
4、域的概念
NSUserDefaults有一个域的概念,当我们调用 NSUserDefaults.standardUserDefaults() 方法时,就会初始化 NSUserDefaults, 并且它默认会包含 5 个 Domain, 分别是:
- NSArgument Domain (参数域) 最高优先级
- Application Domain (应用域) 是最重要的域,它存储着你app通过NSUserDefaults set...forKey添加的设置。
- NSGlobal Domain (全局域) 存储系统设置
- Language-specific Domains (日期,语言)
- Registration Domain (注册域)仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。
registerDefaults:就是把值注册到 Registration Domain (注册域)中,然后我们每次去获取值得时候都会在底层的存储结构中搜索一遍,顺序从优先级最高的开始:
NSArgument Domain -> Application Domain -> NSGlobal Domain -> Language-specific Domains -> NSRegistrationDomain
在使用registerDefaults:时,就是把值注册在了注册域中,而注册域中的数据不会被写到磁盘,所以我们每次在程序启动时都要调用一遍。