NSUserDefaults
NSUserDefaults 是轻量级
的数据持久化
,该数据实际上是以键值对的方式进行存储的(KVC),主要用来保存一些用户程序配置信息
和偏好设置
。以便下次程序启动能恢复到上次的设置。偏好设置一般是记录在包plist
中的,路径为沙盒Document
平级的/Library/preferences
,通过NSUserDefault类来访问。一般可以和沙盒的内容相联系。
NSUserDefaults的优缺点
优点:
- NSUserDefaults是单例所以可以即拿即用,同时也是线程安全的。
缺点:
- 因为是写到硬盘上,所以会比较耗系统资源和内存占用过大的问题
- 轻量级所以不适合存储大量数据
- NSUserDefaults支持的数据格式有限,只支持简单的数据格式
- NSData
- NSString
- NSNumber
- NSDate
- NSArray
- NSDictionary
存储不同的数据类型
存数据
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"jack" forKey:@"name"];
[defaults setInteger:25 forKey:@"age"];
UIImage *image = [UIImage imageNamed:@"xxx"];
NSData *imageData = UIImageJPEGRepresentation(image, 100);
[defaults setObject:imageData forKey:@"image"];
[defaults synchronize]; //synchronize强制存储,并非必要,因为系统会默认调用,但是你确认了就会马上存储
取数据
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *name = [defaults valueForKey:@"name"];
NSInteger age = [defaults integerForKey:@"age"];
UIImage *image2 = [defaults valueForKey:@"image"];
NSUserDefaults 获取沙盒路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@",path);
NSUserDefaults 域
NSUserDefaults 数据库实际是由多个层级的域组成的,当你通过键值查找值时,NSUserDefaults是从上而下通过域的层级来查找的,不同的域有不同的功能,有些域是可持久的,有些则不是
- 应用域(application domain)是最重要的域,它存储着你app通过NSUserDefaults set...forKey添加的设置。
- 注册域(registration domain)仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。
- 全局域(global domain)存储着系统的设置
- 语言域(language-specific domains)则包括地区、日期等
- 参数域( argument domain)有最高优先权