NSUserDefault可以用来保存一些系统的对象。
NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.
如果要保存自定义的对象模型要怎么办呢?
我们把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。
解决方法是实现<NSCoding>协议,让这个自定义类实现协议中的 - (id) initWithCoder: (NSCoder *)coder 和 - (void) encodeWithCoder: (NSCoder *)coder 这两个方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。
保存:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//不能直接存取NSObject,需要先归档转成NSData
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:_User];
[defaults setObject:data forKey:KEY_User];
[defaults synchronize];
读取:
// 读取用户数据
NSData * data = [[NSUserDefaults standardUserDefaults] objectForKey:KEY_User];
// 解档
_User = [NSKeyedUnarchiver unarchiveObjectWithData:data];
实现协议的两个方法:
// 实现NSCoding协议
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
self.userAccount = [coder decodeObjectForKey:@"userAccount"];
self.userPassword = [coder decodeObjectForKey:@"userPassword"];
self.userName = [coder decodeObjectForKey:@"userName"];
self.userIntroduce = [coder decodeObjectForKey:@"userIntroduce"];
}
return self;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:_userAccount forKey:@"userAccount"];
[coder encodeObject:_userPassword forKey:@"userPassword"];
[coder encodeObject:_userName forKey:@"userName"];
[coder encodeObject:_userIntroduce forKey:@"userIntroduce"];
}
最后介绍一个字典模型互转框架 MJExtension
用法可参考:https://my.oschina.net/wolx/blog/396925
github地址:github.com/CoderMJLee/MJExtension
网友评论