关于(archive)归档和(unarchive)解档的处理。

关于(archive)归档和(unarchive)解档的处理。,第1张

概述在面向对象的编程中,会涉及到对象的保存,对象的保存在JAVA当中称之为serialize,也叫序列化。而在cocoa当中,这个过程称之为归档。cocoa当中最最典型的序列化例子就是NIB文件的保存和读取过程。 在cocoa当中如何实现了这个功能的哪? 其实在cocoa当中是通过了NSCoding协议和NSCoder抽象类共同实现的,对于NSCoder抽象类而言,其实他只是一个抽象类,是不能实例化使

在面向对象的编程中,会涉及到对象的保存,对象的保存在JAVA当中称之为serialize,也叫序列化。而在cocoa当中,这个过程称之为归档。cocoa当中最最典型的序列化例子就是NIB文件的保存和读取过程。

在cocoa当中如何实现了这个功能的哪?

其实在cocoa当中是通过了NSCoding协议和NSCoder抽象类共同实现的,对于NSCoder抽象类而言,其实他只是一个抽象类,是不能实例化使用的,而真正使用的是NSCoder的子类,即NSArchiver,NSUnarchiver,NSKeyedArchiver, NSKeyedUnarchiver类的实例对象。

那么实现的关键点有两点:

1、要使的需要存储的对象实现NSCoding协议,从而使他自己满足写二进制数据的能力。即是自己具有序列化的能力。

2、使用NSCoder的子类方法,实现二进制数据的动作,如读或者写。即触发存档过程。

需要注意的一点就是说,其实对于序列化,是一个“一传十,十传百”的过程,父类的序列化,会逐层递归的将所有的子对象也进行了序列化。此外,序列化,能够序列化的是对象实例和类名,而对于方法其实是无法序列化的,因此对于序列化和非序列化的类,都需要使用共同的类定义,否则无法还原。


NSCoding协议的方法:

-(ID)initWithCoder:(NSCoder *)coder; // 读取coder中的数据

-(voID) encodeWithCoder:(NSCoder*)coder;// 向coder中写入数据


NSKeyArchiver的方法

+(NSData*)archivedDataWithRootObject:(ID)rootObject


例子:

#imp ort <Cocoa/Cocoa.h>
@interface codeObj : NSObject <NSCoding>{ Nsstring *name; int magicNumber; float shoseSize; NSMutableArray *subThingIEs; } @property (copy) Nsstring *name; @property int magicNumber; @property float shoseSize; @property (retain) NSMutableArray *subThingIEs; -(ID) initwithname:(Nsstring *) n    magicNumber:(int) mn shoseSize:(float) ss; @end //   codeObj.m //   encodeObject // //   Created by 110 on 10-2-6. //   copyright 2010 __MyCompanyname__. All rights reserved. //
#imp ort "codeObj.h"

@implementation codeObj
@synthesize name; @synthesize magicNumber; @synthesize shoseSize; @synthesize subThingIEs;
-(ID) initwithname:(Nsstring *) n    magicNumber:(int) mn shoseSize:(float) ss{ if(self=[super init]){ self.name=n; self.magicNumber=mn; self.shoseSize=ss; self.subThingIEs=[NSMutableArray array]; } return (self); }
-(voID) dealloc{ [name release]; [subThingIEs release]; [super dealloc]; } //nsCoding协议的方法 -(voID) encodeWithCoder:(NSCoder *) coder{ [coder encodeObject:name forKey:@"name"]; [coder encodeInt:magicNumber forKey:@"magicNumber"]; [coder encodefloat:shoseSize forKey:@"shoseSize"]; [coder encodeObject:subThingIEs forKey:@"subThingIEs"]; }
-(ID) initWithCoder:(NSCoder *)   decoder{ if(self =[super init]){ self.name=[decoder decodeObjectForKey:@"name"]; self.magicNumber=[decoder decodeIntForKey:@"magicNumber"]; self.shoseSize=[decoder decodefloatForKey:@"shoseSize"]; self.subThingIEs=[decoder decodeObjectForKey:@"subThingIEs"]; } return (self); } @end
#import "codeObj.h" int main (int argc,const char * argv[]) {        NSautoreleasePool * pool = [[NSautoreleasePool alloc] init]; codeObj *thing; thing=[[[codeObj alloc] initwithname:@"name" magicNumber:20 shoseSize:30.5] autorelease]; NSLog(@"--------%@",thing); NSData *freezeDrID; freezeDrID=[NSKeyedArchiver archivedDataWithRootObje ct:thing]; [freezeDrID writetofile:@"/tmp/codeobj.txt" atomically:YES]; codeObj *anotherThing; anotherThing=[[[codeObj alloc] initwithname:@"ssssss" magicNumber:20 shoseSize:4.5] autorelease]; [anotherThing.subThingIEs addobject:thing];   NSData *other; other=[NSKeyedArchiver archivedDataWithRootObje ct:anotherThing]; //写入文件 [other writetofile:@"/tmp/objandobj.txt" atomically:YES]; //从文件中读取 NSData *fileData; fileData=[NSData dataWithContentsOffile:@"/tmp/objandobj.txt"]; codeObj *fromfile; fromfile=[NSKeyedUnarchiver unarchiveObjectWithData:fileData]; NSLog(@"------%@",fromfile);        [pool drain];        return 0; } 总结

以上是内存溢出为你收集整理的关于(archive)归档和(unarchive)解档的处理。全部内容,希望文章能够帮你解决关于(archive)归档和(unarchive)解档的处理。所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1055758.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存