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类型,然后丢入数组(或者单例存储)中.