您的位置:首页 > 其它

OC学习--归档与解档

2015-06-16 19:59 211 查看
一 、归档  (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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: