NSCoder对象编码和解码

NSCoder对象编码和解码,第1张

概述转自: 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< /**

转自: 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对象编码和解码所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1054531.html

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

发表评论

登录后才能评论

评论列表(0条)

保存