IOS学习笔记(归档,)

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

-(id)initWithCoder:(NSCoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据

-(void)encodeWithCoder:(NSCoder *)coder;// 读取实例变量,并把这些数据写到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;
-(void)dealloc
{
    [shopID release];
    [title release];
    [discount release];
    [address release];
    [super dealloc];   
}
- (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];
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值