• 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);

  • 相关阅读:
    给域名添加解析
    MATLAB c/c++调用matlab<dll>
    MATLAB 矩阵生成有向网络图
    MATLAB 矩阵生成无向网络图
    MATLAB RGB2YCbCr、YCbCr2RGB
    MATLAB RGB2YUV、YUV2RGB
    MATLAB 直方图匹配
    MATLAB 双边滤波
    MATLAB 区域填充算法,队列版
    MATLAB 二值图像连通区域标记法,两步法
  • 原文地址:https://www.cnblogs.com/iOS771722918/p/4478934.html
Copyright © 2020-2023  润新知