如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复

不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协 议的对象才可以

NSCoding协议有2个方法:

encodeWithCoder:

每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,

可以使用encodeObject:forKey:方法归档实例变量

initWithCoder:

每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解 码文件中的数据为对象的实例变量,

可以使用decodeObject:forKey方法解码实例变量

归档一个NSArray对象到Documents/array.archive

NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];

[NSKeyedArchiver archiveRootObject:array toFile:path];

恢复(解码)NSArray对象 

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

归档(编码)
Person *person = [[[Person alloc] init] autorelease];
person.name = @"MJ";
person.age = 27;
person.height = 1.83f;
[NSKeyedArchiver archiveRootObject:person toFile:path];

恢复(解码)
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

NSKeyedArchiver-归档对象的注意

如果父类也遵守了NSCoding协议,请注意:

应该在encodeWithCoder:方法中加上一句 [super encodeWithCode:encode]; 确保继承的实例变量也能被编码,即也能被归档

应该在initWithCoder:方法中加上一句 self = [super initWithCoder:decoder];
确保继承的实例变量也能被解码,即也能被恢复

代码:

@implementation Person
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@"name"]; [encoder encodeInt:self.age forKey:@"age"]; [encoder encodeFloat:self.height forKey:@"height"];
}
- (id)initWithCoder:(NSCoder *)decoder {
self.name = [decoder decodeObjectForKey:@"name"]; self.age = [decoder decodeIntForKey:@"age"]; self.height = [decoder decodeFloatForKey:@"height"]; return self;
}
- (void)dealloc {
[super dealloc];
[_name release];
}
@end
- (IBAction)saveBtnClick:(id)sender;
- (IBAction)readBtnClick:(id)sender; @end @implementation NJViewController - (IBAction)saveBtnClick:(id)sender {
// 1.创建对象
/*
NJPerson *p = [[NJPerson alloc] init];
p.name = @"lnj";
p.age = 28;
p.height = 1.76;
*/ NJStudent *stu = [[NJStudent alloc] init];
stu.name = @"lnj";
stu.age = ;
stu.height = 1.8;
stu.weight = ; // 2.获取文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];
NSLog(@"path = %@", path); // 3.将自定义对象保存到文件中
// [NSKeyedArchiver archiveRootObject:p toFile:path];
[NSKeyedArchiver archiveRootObject:stu toFile:path]; } - (IBAction)readBtnClick:(id)sender { // 1.获取文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"]; // 2.从文件中读取对象
// NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"%@ %d %.1f %.1f", stu.name, stu.age, stu.height, stu.weight);
}

最新文章

  1. nginx配置SSL证书(使用startSSL申请到的免费证书)
  2. 元素过滤器(Element Filters)
  3. django构建blog--页面部分(eclipse+pydev)
  4. 在maven项目中使用mybatis-generator-maven-plugin生成mybatis代码
  5. JavaScript操作DOM的那些坑
  6. iOS开发——网络编程OC篇&(二)XMPP实现用户登录与注销
  7. 股票市场问题(The Stock Market Problem)
  8. oracle----sqlldr用法(转)
  9. 013-Cookie状态保持
  10. linq 在查询表达式中处理异常
  11. IT服务(运维)管理实施的几个要点--第二章 人员和组织架构
  12. SignalR Self Host+MVC等多端消息推送服务(1)
  13. 如何理解php的依赖注入
  14. ubuntu下查看磁盘读写情况
  15. MySQL与宿主Linux之间交互式执行命令
  16. .NET轻量级ORM组件Dapper葵花宝典
  17. django使用RestFramework的Token认证
  18. python中的__all__和__slots__
  19. select文本框架(change事件)改变另外一个select的值
  20. 网络流入门--最大流算法Dicnic 算法

热门文章

  1. 剑指Spring源码(三)俯瞰Spring的Bean的生命周期(大众版)
  2. 788B(dfs+xjb)
  3. bzoj3171: [Tjoi2013]循环格(费用流)
  4. Pipenv: Python包管理神器
  5. git教程1-gitlab部署
  6. redis使用方法
  7. Vue中的指令(听博主说总结的很好)
  8. 2、kvm基础常用命令操作
  9. DHCP原理和配置
  10. maven POM总结