使用NSUserDefault保存对象模型

NSUserDefault可以用来保存一些系统的对象。

NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果要保存自定义的对象模型要怎么办呢?

我们把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。

解决方法是实现协议,让这个自定义类实现协议中的  - (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

你可能感兴趣的:(使用NSUserDefault保存对象模型)