A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LZZ 中级黑马   /  2015-4-15 20:55  /  2357 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 LZZ 于 2015-4-15 21:02 编辑

      对象编码把对象的类特征以及对象状态转化某种格式,这种格式可存储,也可在进程间传递。类的类型以及实例数据会被写入到某种字节流里面,当程序结束的时候,该字节流可进行持久化。程序启动的时候,新分配对象可以解码之前保存的自身描述,然后把自己恢复到之前运行时的状态。编码通常需和归档协作。归档将对象图转化成一种可以写进文件系统的格式(档案),解档则是在档案上执行操作。在此过程中,保存在档案的对象对需要自身进行解码。
      对象编码也被Mac OS X 系统的分布式对象API用于进程间传输对象。但是归档用得最为普遍,归档和属性表相似,也是一种对象持久化机制。

如何编码解码对象
     如果您期望子类实例能够进行编解码,则子类应遵循NSCoding 协议并实现 initWithCoder:以及encodeWithCoder:方法,这些方法会在程序归解档某个对象图的时候被调用。在encodeWithCoder:方法中,我们会编码对象的重要实例变量,而在initWithCoder:方法中,我们则会解码这些值,并将它们重新赋给实例变量。initWithCoder:消息不会触发对象的初始化方法。
initWithCoder:方法和encodeWithCoder:方法都只需要一个NSCoder 对象作为参数,该对象用于执行实际的编解码动作。NSCoder是个抽象类,大部分情况下,编解码对象是下述具体子类的实例:NSKeyedArchiver,NSKeyedUnarchiver,NSArchiver,NSUnarchiver。归档类声明编码对象实例变量的方法,解档类则声明解码实例变量的方法。
NSCoder方法可作用于对象、标量、C数组、结构体、字符串以及指向这些类型的指针。编码自有类实例变量之前,请您务必要先调用超类的initWithCoder:或者encodeWithCoder:实现。当您从字节流解码对象时,也务必要先保持或复制这些对象,然后再把解码出来的值赋给其实例变量。
键归档和顺序归档
NSCoder有两个具体子类,二者各自使用不同的基本实现方式。“键”归档类(NSKeyedArchiver和NSKeyedUnarchiver)将一个编码值和一个字符串键关联在一起。解码的时候 ,键值之间的关联保持 一致。因此, 实例变量可按任意的次序编解码。如使用另一种类型的编解码器(NSKeyedUnarchiver和NSUnarchiver),您需要以某种次序编码实例变量。解码的时候,您仍要使用相同的次序。顺序编解码器只应在遗留代码里面才能使用,新的子类都应使用键归档编解码器。
例子:
1.协议
[plain] view plaincopy
@interface untitled : NSObject <NSCoding>{  
    NSString *string;  
  
}  
2.实现协议
-(void) encodeWithCoder: (NSCoder *) aCoder{
    //label.text = @"enconde";
    NSLog(@"encode");
    [aCoder encodeObject:string forKey: @"code"];
}

-(id) initWithCoder: (NSCoder *) aDecoder{
    NSLog(@"initWithCoder");
   
    if (self = [super init]) {
        self.string = [aDecoder decodeObjectForKey: @"code"];
        //注意self不能少,与内存管理有关
    }
    return (self);
}
3.归档
[plain] view plaincopy
NSString *path = [[NSBundle mainBundle] bundlePath];  
path = [[NSString alloc] initWithFormat: @"%@%@",path,@"/code.txt"];  
untitled *t;  
[NSKeyedArchiver archiveRootObject:coder toFile:path ];  

4.解档
[plain] view plaincopy
NSString *path = [[NSBundle mainBundle] bundlePath];  
path = [[NSString alloc] initWithFormat: @"%@%@",path,@"/code.txt"];  
untitled *t;  
t = [NSKeyedUnarchiver unarchiveObjectWithFile:path];  

评分

参与人数 15黑马币 +71 收起 理由
泡沫小精灵 + 6 赞一个!
大白菜cabbage + 5 写的太深奥,完全看不懂,不过分还是送上,今.
Ammar + 1 赞一个!
纸飞机的天空 + 1 赞一个!
夜空守望者 + 5 很给力!
郑亚恒 + 4 笔记好样的!很详细!学习啦^_^
流转少年 + 3 赞一个!
王昱 + 5 很给力!
yesha + 2 神马都是浮云
石上波 + 20

查看全部评分

24 个回复

倒序浏览
赞一个
回复 使用道具 举报
我就是来看看的,楼主好人
回复 使用道具 举报
弱弱地顶一下吧
回复 使用道具 举报
先来占个楼层   
回复 使用道具 举报
好帖子! 今天分加完了,12点一过分就送上!
回复 使用道具 举报
顶一个!!!女汉子
回复 使用道具 举报
支持分享了!!
回复 使用道具 举报
看不懂 :L    12点过后给你助攻
回复 使用道具 举报
全是大水比啊
回复 使用道具 举报
我看我有多少技术分和黑马币.顺便赞一个
回复 使用道具 举报
不多啊,不介意,不介意!
回复 使用道具 举报
昨天给完了。。
回复 使用道具 举报
Ammar 中级黑马 2015-4-15 21:55:45
14#
完全看不懂....
回复 使用道具 举报
{:3_60:}老湿老湿老湿,你怎么什么都懂呢,膜拜~~~~~
回复 使用道具 举报
LZZ 中级黑马 2015-4-15 22:15:19
16#
大白菜cabbage 发表于 2015-4-15 21:08
好帖子! 今天分加完了,12点一过分就送上!

谢谢啦 ~~咱们以后学习过程中应该能用上,就当我是提前做个笔记,其实是现在不懂这几块儿
回复 使用道具 举报
很经典啊!今天给的太多了,怕被封了!
回复 使用道具 举报
LZZ 中级黑马 2015-4-15 22:19:23
18#
波阿波 发表于 2015-4-15 21:11
看不懂     12点过后给你助攻

嗯,其实我也不懂,因为毕竟OC还没学习,大家一起了解下
回复 使用道具 举报
听说你差一个黑马币,给补上
回复 使用道具 举报
貌似很厉害的样子
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马