1、面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving.
二进制流可以通过网络或写入文件中
例:NSKeyedArchiver
========================================================*/
NSString *str = @”abc”;
NSString *astr = @”efg”;
NSArray *Array = [NSArray arrayWithObjects:str, astr, nil];
//保存数据
NSString *Path =
[NSSearchPathForDirectori
NSUserDomainMask, YES) objectAtIndex:0];
NSString *filename = [Path
stringByAppendingPathCom
[NSKeyedArchiver
archiveRootObject:Array
str = @”a”;
astr = @”";
//加载数据
NSArray *arr =
[NSKeyedUnarchiver
filename];
str = [arr objectAtIndex:0];
astr =
objectAtIndex:1];
NSLog(@”str:%@”,str);
NSLog(@”astr:%@”,astr);
2、在nsstring 的类的定义中已经添加了协议 即他是实现了nscoding 代理的方法的。
@interface NSString : NSObject
NScoding 是一个协议,主要有下面两个方法
-(id)initWithCoder:(NSCoder
*)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据
-(void)encodeWithCoder:(NSCoder *)coder;//
读取实例变量,并把这些数据写到coder中去。序列化数据
NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。
NSKeyedUnarchiver
NSKeyedArchiver
一般是在自己定义的类中需要在.h 文件中加入
在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用
例如对一个数据类的封装如下:
@interface Restaurant : NSObject {
shopID;
title;
discount;
address;
}
@property (nonatomic, copy) NSString *shopID;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *discount;
@property (nonatomic, copy) NSString *address;
@end
@implementation Restaurant
@synthesize shopID,title,discount,address;
-(void)dealloc
{
release];
release];
release];
release];
dealloc];
}
- (id)initWithCoder:(NSCoder *)coder
{
(self = [super init]) {
= [[coder decodeObjectForKey:@"shopid"] retain];
[[coder decodeObjectForKey:@"title"] retain];
decodeObjectForKey:@"discount"] retain];
decodeObjectForKey:@"address"] retain];
self;
}
-(void)encodeWithCoder:(NSCoder *)coder
{
encodeObject:shopID forKey:@"shopid"];
encodeObject:title forKey:@"title"];
encodeObject:discount forKey:@"discount"];
encodeObject:address
forKey:@"address"];
}
@end
下一步就是保存和加载数据了:
注:history对象是一个NSMutableArray数组,用来装Restaurant对象。
-(void)
saveArchiver
{
= NSSearchPathForDirectori
NSUserDomainMask, YES);
filename = [[paths objectAtIndex:0]
stringByAppendingPathCom
(history && [history count]>0) {
archiveRootObject:history
{
= [NSFileManager defaultManager];
([defaultManager isDeletableFileAtPath:filename]) {
removeItemAtPath:filename error:nil];
}
-(void)
loadArchiver
{
= NSSearchPathForDirectori
NSUserDomainMask, YES);
filename = [[paths objectAtIndex:0]
stringByAppendingPathCom
[NSKeyedUnarchiver
}