NSUserDefaults深入解析

首先,NSUserDefaults是系统提供的的一个类,其实通过名字我们都可以理解到,主要保存应用程序设置和属性以及用户数据.比如你可以用来存储用户在应用程序中使用的图片或默认颜色方案,或者说是保存密码,自动登录这些等等配置.

然而NSUserDefaults的本质其实就是Plist(/Library/Prefereces,里面有个plist文件,存储的就是你的userDefaults)(也就是说一个Value 一个Key ).并且NSUserDefaults是单例,同时也是线程安全的.iOS的defaults系统在整个app中都是可用的,因此存放到defaults系统中的数据也是整个应用程序生命周期中可用的。也就是说,无论用户关闭程序还是关机,在用户再次打开程序或开机后这些数据仍然存在。

引入官方支持的数据类型:

NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,NSURL, BOOL类型

如果用3个词来形容它:1.方便2.高效3.超轻量级.

如果将默认数据库比喻为SQL Server数据库,那么NSUserDefaults就相当于SQL语句。就像我们通过SQL语句可以对SQL Server数据库进行增删改查操作一样。我们可以通过NSUserDefaults对默认系统操作。

  • NSUserDefaults 存储的对象全是不可变的(这一点非常关键,弄错的话程序会出bug)
    例如,如果我想要存储一个 NSMutableArray 对象,我必须先创建一个不可变数组(NSArray)再将它存入NSUserDefaults中去,代码如下:

        NSMutableArray mutableArray = [NSMutableArray arrayWithObjects:@”bird”,@”michael”, nil];
    NSArray
    array = [NSArray arrayWithArray:mutableArray];

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@”user”];
    取出数据是一样的,想要用NSUserDefaults中的数据给可变数组赋值

先给出一个错误的写法:

    NSUserDefaults user = [NSUserDefaults standardUserDefaults];
NSMutableArray
mutableArray = [user objectForKey:@”user”];

这样写后,mutableArray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug.
所以正确写法是:

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"user"];</pre>

 

以下列举了一些常用的:

+ (NSUserDefaults *)standardUserDefaults

创建一个NSUserDefaults实例。后,如果 默认数据库 没有建立,那么,默认数据库将被按照以下顺序被建立。

NSArgumentDomain(应用程序域,应用范围在该应用程序中)

NSGlobalDomain(全局域,所有应用程序都将公用该域)

NSRegistrationDomain(临时域,为了确保创建成功)

(当然,取值的时候,也应该是这样的顺序吧,这样才能保证不同应用程序中的数据不被冲突)

 

+ (void)resetStandardUserDefaults

将内存中进行的修改,同步到默认数据库中。

 

- (id)init

初始化一个默认的NSUserDefaults

 

- (id)initWithUser:(NSString *)username

初始化一个特定用户的NSUserDefaults,如果该用户不存在,则返回nil

 

- (void)removeObjectForKey:(NString *)defaultName

删除响应的项

 

Get方法

- (id)objectForKey:(NSString *)defaultName;

  • (NSString )stringForKey:(NSString )defaultName;
  • (NSArray )arrayForKey:(NSString )defaultName;
  • (NSDictionary )dictionaryForKey:(NSString )defaultName;
  • (NSData )dataForKey:(NSString )defaultName;
  • (NSArray )stringArrayForKey:(NSString )defaultName;
  • (NSInteger)integerForKey:(NSString *)defaultName;
  • (float)floatForKey:(NSString *)defaultName;
  • (double)doubleForKey:(NSString *)defaultName;
  • (BOOL)boolForKey:(NSString *)defaultName;
  • (NSURL )URLForKey:(NSString )defaultName NS_AVAILABLE(10_6, 4_0);
     

Setting方法:

- (void)setObject:(id)value forKey:(NSString *)defaultName;

  • (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
  • (void)setFloat:(float)value forKey:(NSString *)defaultName;
  • (void)setDouble:(double)value forKey:(NSString *)defaultName;
  • (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
  • (void)setURL:(NSURL )url forKey:(NSString )defaultName NS_AVAILABLE(10_6, 4_0);
     

官方头文件还有很多其他方法,就不全部解释了.

另外,一般使用 NSUserDefaults 存储自定义对象,会先将自定义类型转换为NSData类型,然后丢入数组(或者单例存储)中.