ios开发中归档的一些心得

来源:互联网 发布:淘宝下架的宝贝买家 编辑:程序博客网 时间:2024/04/30 03:29

早在NSString的类的定义中,再添加协议<NSConding> 实现其代理的方法。

@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>

NScoding 是一个协议,主要有下面两个方法

//从coder中读取数据,保存到相应的变量中,即反序列化数据

-(id)initWithCoder:(NSCoder *)coder;

// 读取实例变量,并把这些数据写到coder中去。序列化数据

-(void)encodeWithCoder:(NSCoder *)coder;

NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。

NSKeyedUnarchiver   从二进制流读取对象。

NSKeyedArchiver       把对象写到二进制流中去。

一般是在自己定义的类中需要在.h 文件中加入<NScoding>

在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用

例如对一个数据类的封装如下:

@interface Restaurant : NSObject {
    NSString* shopID;       
    NSString* title;     
    NSString* discount; 
    NSString* 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;


- (id)initWithCoder:(NSCoder *)coder {
    if (self = [super init]) {
        shopID = [[coder decodeObjectForKey:@"shopid"] retain];
        title  = [[coder decodeObjectForKey:@"title"] retain];
        discount=[[coder decodeObjectForKey:@"discount"] retain];
        address=[[coder decodeObjectForKey:@"address"] retain];   
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:shopID forKey:@"shopid"];
    [coder encodeObject:title forKey:@"title"];
    [coder encodeObject:discount forKey:@"discount"];
    [coder encodeObject:address forKey:@"address"]; 
}
@end


下一步就是保存和加载数据了:

注:history对象是一个NSMutableArray数组,用来装Restaurant对象。

//保存数据

-(void) saveArchiver     
{

    //获取路径和保存文件

    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* filename = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"history.dat"];
   
    if (history && [history count]>0) {
        [NSKeyedArchiver archiveRootObject:history toFile:filename];
    }else {
        //删除归档文件
        NSFileManager *defaultManager = [NSFileManager defaultManager];
        if ([defaultManager isDeletableFileAtPath:filename]) {
            [defaultManager removeItemAtPath:filename error:nil];
        }
    }
}


//加载数据

-(void) loadArchiver {
    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* filename = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"history.dat"];
    self.history= [NSKeyedUnarchiver unarchiveObjectWithFile:filename];

}


//释放

-(void)dealloc {
    [shopID release];
    [title release];
    [discount release];
    [address release];

    [super dealloc];   
}


0 0