NScoder和NScoding简析

NScoder  和 NScoding 有将自己定义的类的对象写入磁盘的作用

NScoding 是一个协议,主要有下面两个方法

-(void)encodeWithCoder:(NSCoder *)coder;// 序列化数据

-(id)initWithCoder:(NSCoder *)coder; // 反序列化数据

NSCoder 是一个抽象类,抽象类不能被实例化,只能提供一些想让子类继承的方法。

NSKeyedUnarchiver  // 反归档 从二进制流读取对象。

NSKeyedArchiver      // 归档  把对象写到二进制流中去。

示例代码:

// 设计一个UserModel类,其中有三个属性userName、userTel和userAge

// userModel.h

#import <Foundation/Foundation.h>

// 包含NSCoding协议

@interface UserModel :NSObject<NSCoding>


@property (strong,nonatomic)NSString* userName;

@property (strong,nonatomic)NSString* userTel;

@property (assign,nonatomic)int userAge;


@end

// userModel.m

#import "UserModel.h"

@implementation UserModel

#pragma mark- NSCoding协议方法

// 序列化数据 读取实例化数据,并把数据写入到NSCoder中去

- (void)encodeWithCoder:(NSCoder *)aCoder

{

    // 类对象使用encodeObject: 普通则使用数据类型即可

    [aCoder encodeObject:self.userNameforKey:@"userName"];

    [aCoder encodeObject:self.userTelforKey:@"userTel"];

    [aCoderencodeInt:self.userAgeforKey:@"userAge"];

}

// 反序列化数据 从NSCoder中读取数据 保存到相应变量中

- (id)initWithCoder:(NSCoder *)aDecoder

{

    // 类对象使用decodeObjectForKey: 若普通则使用数据类型即可 decodeIntForKey:

    self = [superinit];

    if (self) {

        self.userName = [aDecoderdecodeObjectForKey:@"userName"];

        self.userTel = [aDecoderdecodeObjectForKey:@"userTel"];

    self.userAge = [aDecoder decodeIntForKey:@"userAge"];

    }

    return self;

}

@end

// RootViewController.m 私有成员 UITableView * _tableView(表)和NSMutableArray * _dataSource(数据源)

// 反归档

- (void)createDatasource

{

    _dataSource = [[NSMutableArrayalloc]init];

    //假设我们存储过一些内容到NSUserDefaults里,那么我们在加载视图的时候,就应该先读取文件里的内容

    // NSUserDefaultsiOS里本地存储的处理方式之一,它的工作原理实际上就是plist的文件的读写操作。NSUserDefaults对象是一个单例对象,这个对象可以访问app沙箱目录里自带的一个plist文件,它支持读写操作。

    NSUserDefaults* manager = [NSUserDefaultsstandardUserDefaults];

    //我们假设采用的时@“userInfo”这个键做的存储操作,所以读取的时候,还要使用这个键读

    NSArray* localDatas = [manager objectForKey:@"userInfo"];

    if (localDatas.count) {

        //自定义对象写入文件的时候一定是被归档的,所以我们读取出来的数据是NSData对象,使用之前应先进行反归档 (从二进制流中读出model对象)

        for (NSData* objin localDatas) {

            UserModel* model = [NSKeyedUnarchiverunarchiveObjectWithData:obj];

    // 此时会调用model类的反序列化数据方法initWithCoder:(NSCoder)aDecoder

            [_dataSource addObject:model];

        }

        return;

    }

}

// 归档

- (void)viewWillAppear:(BOOL)animated

{

    //在视图重新显示之前,刷新表格

    [_tableView reloadData];

    //只要表格被重新刷新,就保存一次数据

    NSMutableArray* saveDatas = [[NSMutableArrayalloc]init];

    for (UserModel* objin_dataSource) {

// 对该类序列化 将model类对象写入二进制流

       NSData* data = [NSKeyedArchiverarchivedDataWithRootObject:obj];

// 此时会调用model类的序列化方法 encodeWithCoder:(NSCoder)aCoder

        [saveDatas addObject:data];

    }

    // 把数据写入plist文件

    NSUserDefaults* manager = [NSUserDefaults standardUserDefaults];

    [manager setObject:saveDatasforKey:@"userInfo"];

    [manager synchronize];

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值