转自: http://o0o0o0o.javaeye.com/blog/588889
//
// codeObj.h
// encodeObject
//
// Created by 110 on 10-2-6.
// copyright 2010 __MyCompanyname__. All rights reserved.
//
#import <Cocoa/Cocoa.h<
/**
cocoa具备一种机制来将对象自身转换为某种格式并保存中磁盘上。
对象可以将它们的实例变量和其他数据编码为数据块,然后保存到磁盘中。以后将这些数据块都会到内存中,并且
还能基于保存的数据创建新对象。这个过程称为编码和解码,或称为序列化和反序列化。
*/
/**
要编码的对象,必须实现NSCoding协议。
@protocol NSCoding
-(voID) encoderWithCoder:(NSCoder *) aCoder;
-(ID) initWithCoder:(NSCoder *) aDecoder;
@end
当对象需要保存自身时-encoderWithCoder:方法被调用
当对象需要加载自身时-initWithCoder:方法被调用
*/
@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.
//
#import "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"];
}
/**
initWithCode:和其他init方法一样,中对对象执行 *** 作之前,需要使用超类对它们进行初始化。为此,可以采用
两种方式,具体取决于父类,如果父类采用了NSCoding协议,则应该调用[super initWithCoder:decoder];
否则,只需要调用[super init]即可。NSObject不采用NSCoding协议,因此我们可以使用简单的init方法
*/
/**
decodeObjectForKey:把一个对象从解码器中取出
decodeIntForKey:把int从解码器中取出,在嵌入的对象上递归使用initWithCoder:方法。
*/
-(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);
}
-(Nsstring *) description{
Nsstring *descripton=[Nsstring stringWithFormat:@"%@:%d,%.1f,%@",name,magicNumber,
shoseSize,subThingIEs];
return (descripton);
}
@end
<SPAN < <SPAN <#import <Foundation/Foundation.h<</SPAN<</SPAN<
<SPAN <</SPAN<#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);
/**
+archivedDataWithRootObject:类方法编码thing对象。首先,它在后台创建一个NSKeyedArchiver实例
,然后,它将NSKeyedArchiver实例传递给对象thing的-encodeWithCoder:方法。当thing编码自身的属性时
,它可能对其他对象也进行编码,例如字符串,数组以及我们可能输入到该数组中的任何内容。整个对象集合完成键和值
的编码后,具有键/值对的归档程序将所有对象扁平化为一个NSData类并将其返回.
*/
NSData *freezeDrID;
freezeDrID=[NSKeyedArchiver archivedDataWithRootObject: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 archivedDataWithRootObject: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;
}
总结以上是内存溢出为你收集整理的NSCoder对象编码和解码全部内容,希望文章能够帮你解决NSCoder对象编码和解码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)