iOS归档,解档

  iOS中,将一个实例对象存入沙盒中,叫归档;从沙盒文件中读取一个实例对象,叫解档.

  下面即将诞生一个栗子:比如你想把一个ZHHPerson类中的name与age属性的值存入沙盒文件中,并在需要的时候,去沙盒文件中读取出来.

分析:

  要对Person类的对象实现归档,解档的操作,必须要实现这两个方法:encodeWithCoder:归档时系统自动执行;initWithCoder:解档时系统自动执行.

  对着两个方法的实现,这里采用的是高大上的用法:运行时机制.这个栗子看不出运行时机制的好处.但是的但是,最后没有了但是.

 

ZHHPerson.h

#import <Foundation/Foundation.h>

 

@interface Person : NSObject

 

@property (nonatomic, copy) NSString* name;

@property (nonatomic, assign) int age;

 

@end

 

ZHHPerson.m

#import "ZHHPerson.h"

#import <objc/runtime.h>

 

@implementation ZHHPerson

 

// 解档

- (id)initWithCoder:(NSCoder *)decoder {

    

    if (self = [super init]) {

        u_int count;

        // 获取本类的所有成员变量

        Ivar* ivars = class_copyIvarList([self class], &count);

        for (u_int i=0; i<count; i++) {

            // 取出对应位置的成员变量

            Ivar ivar = ivars[i];

            const char* keyChar = ivar_getName(ivar);

            // 解档

            NSString* keyStr = [NSString stringWithUTF8String:keyChar];

            [self setValue:[decoder decodeObjectForKey:keyStr] forKey:keyStr];

        }

        

        free(ivars);

    }

    return self;

}

 

// 归档

- (void)encodeWithCoder:(NSCoder *)encoder

{

    unsigned int count = 0;

    

    // 获取本类的所有成员变量

    Ivar *ivars = class_copyIvarList([self class], &count);

    

    // 遍历所有的成员变量

    for (int i = 0; i<count; i++) {

        // 取出对应位置的成员变量

        Ivar ivar = ivars[i];

        

        // 查看成员变量

        const char *keyChar = ivar_getName(ivar);

        

        // 归档

        NSString *keyStr = [NSString stringWithUTF8String:keyChar];

        [encoder encodeObject:[self valueForKey:keyStr] forKey:keyStr];

    }

    

    // 释放

    free(ivars);

    

}

 

 

// 重写

- (NSString*)description {

    return [NSString stringWithFormat:@"name = %@, age = %d",self.name, self.age];

}

 

@end

 

 

ZHHPerson类就OKle.

现在可以用这个类来做解档,归档操作了.

归档:

  ZHHPerson* p = [[Person alloc] init];

    p.name = @"ZHH";

    p.age = 25;

    [NSKeyedArchiver archiveRootObject:p toFile:path];

解档:

  ZHHPerson* p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    NSLog(@"%@",p);

posted @ 2015-05-05 13:49  花园晓雨  阅读(811)  评论(0编辑  收藏  举报