美文网首页
使用NSUserDefault保存对象模型

使用NSUserDefault保存对象模型

作者: Gary_Kwok | 来源:发表于2016-12-16 12:50 被阅读0次

    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

    相关文章

      网友评论

          本文标题:使用NSUserDefault保存对象模型

          本文链接:https://www.haomeiwen.com/subject/ebenmttx.html