NSuserDefaults在iOS中特别适合于存储轻量级数据,比如用户和密码,是否已登录标志,mjrefresh的记录上次刷新时间等。
NSuserDefaults可以存储的数据类型有:NSNumber、NSString、NSDictionary、NSArray、NSData、NDDate基本覆盖了常用的数据类型,以下是它们使用的例子:
//NSNumber
[[NSUserDefaultsstandardUserDefaults]setObject:@(123)forKey:@"number"];
NSNumber *valueNumber = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"number"];
//NString
[[NSUserDefaultsstandardUserDefaults]setObject:@"hey"forKey:@"string"];
NSString *valueString = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"string"];
//NSDictory
NSDictionary *dic =@{@"dicKey":@"dicValue"};
[[NSUserDefaultsstandardUserDefaults]setObject:dicforKey:@"dic"];
NSDictionary *dicData = [[NSUserDefaultsstandardUserDefaults]valueForKey:@"dic"];
//NSMutableDictionary
NSMutableDictionary *mutableDic = [NSMutableDictionarydictionary];
[mutableDic addEntriesFromDictionary:@{@"qwertyu":@"qwertyyu"}];
[[NSUserDefaultsstandardUserDefaults]setObject:mutableDicforKey:@"mutableDic"];
NSDictionary *mutData = [[NSUserDefaultsstandardUserDefaults]valueForKey:@"mutableDic"];
//NSArray
NSArray *array =@[@"1",@"2",@"3"];
[[NSUserDefaultsstandardUserDefaults]setObject:arrayforKey:@"array"];
NSArray *arrayData = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"array"];
是不是非常的简便!
有时候我们想保存自定义的数据类型,比如保存:账号、密码、上次登录时间。
@interface UserLoginInfo : NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *password;
@property (nonatomic,copy)NSString *loginDate;
@end
UserLoginInfo不属于NSuserDefaults可以保存的类型,这个时候就不能之间将UserLoginInfo存放到NSuserDefaults里了,需要我们自己将UserLoginInfo对象转化为可以存放的类型NSData类型,然后才能保存:
遵从NSCopying协议,并实现协议的编码和解码接口:
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullableinstancetype)initWithCoder:(NSCoder *)aDecoder;
还是上面保存:账号、密码、上次登录时间的例子:
@interface UserLoginInfo : NSObject <NSCopying>
@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *password;
@property (nonatomic,copy)NSString *loginDate;
@end
@implementation UserLoginInfo
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.nameforKey:@"name"];
[aCoder encodeObject:self.passwordforKey:@"password"];
[aCoder encodeObject:self.loginDateforKey:@"loginDate"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [superinit]) {
self.name = [aDecoderdecodeObjectForKey:@"name"];
self.password = [aDecoderdecodeObjectForKey:@"password"];
self.loginDate = [aDecoderdecodeObjectForKey:@"loginDate"];
}
returnself;
}
然后通过NSKeyedArchiver将UserLoginInfo转化为NSdata:
UserLoginInfo *loginInfo = [[UserLoginInfoalloc]init];
loginInfo.name =@"gx_wqm";
loginInfo.password =@"password";
loginInfo.loginDate =@"2012-05-06 12: 34: 11";
NSData *logData = [NSKeyedArchiverarchivedDataWithRootObject:loginInfo]; //UserLoginInfo转化为NSdata
[[NSUserDefaultsstandardUserDefaults]setObject:logDataforKey:@"loginInfo"]; //保存NSdata
NSData *saveData = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"loginInfo"];//获取NSdata
UserLoginInfo *aaaa = [NSKeyedUnarchiverunarchiveObjectWithData:saveData]; //将nsdata转化为UserLoginInfo
@end
也就是说我们遵从NSCopying协议是为了让NSKeyedArchiver知道如何对UserLoginInfo进行编码和解码(UserLoginInfo与NSdata的相互转化)。