iOS本地存储——NSUserDefaults

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:时,就是把值注册在了注册域中,而注册域中的数据不会被写到磁盘,所以我们每次在程序启动时都要调用一遍。

你可能感兴趣的:(iOS本地存储——NSUserDefaults)