OC学习--归档与解档

、归档  (archive)—文件本地化的一种操作

归档是把对象写入文件中保存在硬盘中,当再次重新打开程序时,可以还原这些对象。

对象归档,就是把内存中对象持久化,对象解档就是持久化对象读取道内存。


【认识归档】

    1、归档就是将对象按照特定的顺序写入到文件中,以便以后再次从文件中读取对象。

    2、解档就是从已经归档的文件中读成对象的过程

    3、进行归档的对象所属的类必需遵从NSCoding协议,必需实现协议中规定的方法

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

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

    4、进行归档的对象的子对象也要遵从NSCoding,也要实现协议中规定的方法,否则归档会失败


【归档使用】

1、系统类的归档

归档:

BOOL ret = [NSKeyedArchiverarchiveRootObject:dic toFile:PATH];

归档道本地如果归档成功返回YES


解档:

id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:PATH];

        NSLog(@"%@", obj);

2、自定义类的归档


进行归档的对象所属类必须遵从NSCoding协议,必须实现协议中的方法,进行归档的子对象也得遵从NSCoding,也要实现协议中规定的方法!!

【JYStudent】类

@interface JYStudent :NSObject<NSCoding>

///需要遵从NSCoding协议

@property NSString *name;

@property int age;

@property float grade;

@property NSUInteger number;


- (instancetype)initWithName:(NSString *)name age:(int)age grade:(float)grade number:(NSUInteger)number;


@end




@implementation JYStudent


- (instancetype)initWithName:(NSString *)name age:(int)age grade:(float)grade number:(NSUInteger)number

{

   if (self = [superinit]) {

       _name = name;

       _age = age;

       _grade = grade;

       _number = number;

    }

    return self;

}


- (NSString *)description

{

    return [NSStringstringWithFormat:@"name:%@ age:%d grade:%.2f number:%lu",_name, _age, _grade,_number];

}

//在归档的时候调用(协议中的方法)(父类遵从子类也要遵从)

//归档编码

- (void)encodeWithCoder:(NSCoder *)aCoder

{

    [aCoder encodeObject:_nameforKey:@"name"];

    [aCoderencodeInt:_ageforKey:@"age"];

    [aCoderencodeFloat:_gradeforKey:@"grade"];


}

//在解档的时候调用(协议中的方法)

//归档解码

- (id)initWithCoder:(NSCoder *)aDecoder

{

   if (self = [superinit]) {

       _name = [aDecoder decodeObjectForKey:@"name"];

       _age = [aDecoder decodeIntForKey:@"age"];

       _grade = [aDecoder decodeFloatForKey:@"grade"];

       _number = [aDecoder decodeIntegerForKey:@"number"];

    }

    return self;

}


 @end



【JYClass】类


@class JYStudent;


@interface JYClass :NSObject<NSCoding>

//需要遵从NSCoding协议

@propertyNSString *className;

@propertyJYStudent *student;


@end

@implementation JYClass


- (NSString *)description

{

    return [NSStringstringWithFormat:@"className:%@\n student:%@",_className,_student];

}


- (void)encodeWithCoder:(NSCoder *)aCode

{

    [aCode encodeObject:_classNameforKey:@"className"];

    [aCode encodeObject:_studentforKey:@"student"];

}

- (id)initWithCoder:(NSCoder *)aDecoder

{

   if (self = [superinit]) {

       _className = [aDecoder decodeObjectForKey:@"className"];

       _student = [aDecoder decodeObjectForKey:@"student"];

    }

    return self;

}


@end



【main】


JYClass *iOS1507 = [[JYClassalloc] init];

        iOS1507.className =@"ZZ-iOS1507";

       JYStudent *stu = [[JYStudentalloc] initWithName:@"xiaoWang"age:18 grade:80 number:250];

        iOS1507.student = stu;

       //归档

       BOOL ret = [NSKeyedArchiverarchiveRootObject:iOS1507 toFile:PATH];

       if (ret == YES) {

           NSLog(@"归档成功");

        }else {

           NSLog(@"归档失败");

        }


        id class = [NSKeyedUnarchiverunarchiveObjectWithFile:PATH];//解档

       NSLog(@"%@", class);





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值