如果对象是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);
}

IOS NSKeyedArchiver(归档存取数据)的更多相关文章

  1. iOS学习之应用数据存储1-属性列表、偏好设置、NSKeyedArchiver归档

    iOS应用数据存储的常用方式(持久化方式) 属性列表(plist)归档(XML文件) Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core ...

  2. IOS 数据存储(NSKeyedArchiver 归档篇)

    什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...

  3. iOS Swift3.0 OC 数据储存--归档

    一.Swift 3.0 1.model class userModel: NSObject,NSCoding { var account: String = "" var regm ...

  4. UI:归档、反归档、数据持久化

    支持的文件读写类型:字符串.数组.字典.NSdata  (可变的.不可变的.共有8个类) 对于数组.字典在写入文件时,其中的元素也必须是以上四种类型之一. 支持的数据类型有限.且简单 写入文件: 字符 ...

  5. IOS四种保存数据的方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...

  6. IOS 四种保存数据的方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...

  7. iOS 写入文件保存数据的方式

     在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeye ...

  8. iOS中几种数据持久化方案

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  9. iOS沙盒及数据存储

    时间久了容易忘,针对沙盒的相关实用技巧做一个记录和整理. 一.iOS数据存储常用方式 1.XML属性列表(plist) 不是所有对象都可以写入: 2.Preference(偏好设置) 本质还是通过“p ...

随机推荐

  1. CodeForces 110C 【构造】

    思路: 7越多越好,然后从7最多个数枚举过去,判断一下剩下的能不能用4解决就好了: #include <bits/stdc++.h> using namespace std; typede ...

  2. hdu2874(lca / tarjan离线 + RMQ在线)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 给出 n 个顶点 m 条边的一个森林, 有 k 个形如 x y 的询问, 输出 x, ...

  3. 2017-10-24 NOIP模拟赛

    括号序列 (bracket) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法 ...

  4. 洛谷P3146 [USACO16OPEN]248

    P3146 [USACO16OPEN]248 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...

  5. cmd与bat脚本的使用

    零. bat cmd 命令大全 bat命令大全学习 一..定位到当前路径 1.定位到当前路径 2.方法二 3.win10下面 通解: %windir%\system32\cmd.exe 二 .使用命令 ...

  6. STP-19-Port-Channel发现和配置

    工程师在给一台交换机上的特定Port-Channel增加多个端口时,有一些配置参数必须相同,如下所示:   使用相同的速率和双工设置: 使用相同的操作模式(Trunk.Access.动态): 若不为T ...

  7. RabbitMQ权限

    RabbitMQ 引言 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队 ...

  8. PHP var_export

    var_export可以将一个数组转为一个字符串 不同于var_dump,var_export并不会输出数据的类型以及字符大小等,只会简单把数组的key跟value拼接成一个字符串 <?php ...

  9. c/c++技巧总结

    1.bzero().memset()初始化结构体. 2.求结构体分量在结构体中地址偏移量 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) ...

  10. js小数点后保留几位方法:toFixed

    (0.22223343534).toFixed(2) 结果:0.22