NSUserDefaults类提供了一个与默认系统进行交互的编程接口。
NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等
。默认系统允许应用程序自定义它的行为去迎合用户的喜好。你可以在程序运行的时候从用户默认的数据库中读取程序的设置。
2 >NSUserDefaults使用细节
1.从NSUserDefaults返回的值是不可改变
的,即便是你在存储的时候使用的是可变的值。例如你使用mutableString做为“MyStringDefault”的值,当你再使用stringForKey:方法获取的值,这个值仍然是不可变的。
2.NSUserDefaults是单例,通过类方法standardUserDefaults
可以获取NSUserDefaults单例,同时也是线程安全的。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];```
3.NSUserDefaults单例以`key-value`的形式存储了一系列偏好设置,key是名称,value是相应的数据。存/取数据时可以使用方法objectForKey:和setObject:forKey:来把对象存储到相应的plist文件中,或者读取,既然是plist文件,那么对象的类型则必须是plist文件可以存储的类型,如下:
NSData
NSString
NSNUmber
NSDate
NSArray
NSDictionary这些实例
如果你想存储其他类型的对象,你要将其归档
并创建一个NSData来实现存储。
需要注意的是,即使对象是NSArray或NSDictionary,他们存储的类型也应该是以上范围包括的。```
3> 实例
#存储基本数据
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@”jack“ forKey:@"firstName"];
[defaults setInteger:10 forKey:@"Age"];
#存储一个图片
UIImage *image =[UIImage imageNamed:@"somename"];
NSData *imageData = UIImageJPEGRepresentation(image, 100); #把image归档为NSData
[defaults setObject:imageData forKey:@"image"];
[defaults synchronize];
//synchronize, 是为了避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用`synchronize`方法来使内存中的缓存与用户默认系统进行同步。
#读取基本数据
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *firstName = [defaults objectForKey:@"firstName"];
NSInteger age = [defaults integerForKey:@"Age"];
#读取图片数据
NSData *imageData = [defaults dataForKey:@"image"]; #先保存到NSData
UIImage *image = [UIImage imageWithData:imageData];
4>直接指明类型存储
- setBool:forKey:
- setFloat:forKey:
- setInteger:forKey:
- setDouble:forKey:
- setURL:forKey:
//方法-setInteger:,这跟常用的-setObject:相比设置类型更明确。
5> NSUserDefaults的 域
NSUserDefaults数据库中其实是由多个层级的域组成的,当你读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不同的域有不同的功能,有些域是可持久的,有些域则不行。
* 应用域(application domain)是最重要的域,它存储着你app通过NSUserDefaults set...forKey添加的设置。
* 注册域(registration domain)仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。
* 全局域(global domain)则存储着系统的设置
* 语言域(language-specific domains)则包括地区、日期等
* 参数域( argument domain)有最高优先权