NSUserDefaults适合存储轻量级的本地数据存储,比如保存登陆界面的用户名、密码之类的数据,并使之本地持久化。
NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型。
[NSUserDefaults standardUserDefaults]
是系统提供的单例方法。
一般通过[[NSUserDefaults standardUserDefaults]
setObject:forKey:]来存储数据。
通过[[NSUserDefaults standardUserDefaults] objectForKey:]
来获取已存数据。
每次存储数据后用[[NSUserDefaults standardUserDefaults] synchronize]
方法持久化数据,直接同步到文件里。 NSUserDefaults存储方式跟字典类似,事实上,NSUserDefaults就是一个Plist文件,它的数据都存储在应用程序内置的一个Plist文件里。
例:
NSDictionary *userInfoDic = [NSDictionary dictionary];
[userInfoDic setObject:@"admin" forKey:@"UserName"];
[userInfoDic setObject:@"123456" forKey:@"Password"];
[[NSUserDefaults standardUserDefaults] setObject:userInfoDic forKey:@"UserInformation"];
//持久化数据,直接同步到文件里
[[NSUserDefaults standardUserDefaults] synchronize];
但是NSUserDefaults不能存储自定义的类对象,若把一个对象存储到NSUserDefaults会报错。聪明的人会把对象放进数组,再把数组存入NSUserDefaults,不过这样做也是错误的,因为数组中包含了自定义对象。 若要在NSUserDefaults中存入自定义对象,则对象需要遵循NSCoding协议,并实现encodeWithCoder
方法和initWithCoder
方法。
还有要注意的一点是:类型为NSNull
的空数据也是无法存入NSUserDefaults的。若数据中有NSNull
类型空数据,把它置 nil
或@""
即可存入NSUserDefaults,否则程序会崩溃。
如果要存储的NSDictionary
里面有NSNull
对象,可以使用遍历方法将NSNull
对象转为@""
对象再次存储,下面是一个简单的处理方法:
对基类NSDictionary添加Category,即下面的公有方法,使用NSDictionary的对象即可调用该方法:
- (NSDictionary *)safeDictionaryWithDic:(NSDictionary *)dic
{
NSMutableDictionary *mutableDic = [[NSMutableDictionary alloc] initWithDictionary:dic];
[mutableDic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if (obj == [NSNull null] || obj == nil) {
[mutableDic removeObjectForKey:key];
[mutableDic setObject:@"" forKey:key];
}
}];
return [[NSDictionary alloc] initWithDictionary:mutableDic];
}
总结:NSUserDefaults是一个轻量级的数据库,使用起来还是很方便的!