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里,那么我们在加载视图的时候,就应该先读取文件里的内容
// NSUserDefaults是iOS里本地存储的处理方式之一,它的工作原理实际上就是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];
}