zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    整理一下看过的图像识别的文章(人脸、车牌、验证码)
    从大象安全套到超级表格
    HDU 3157 Crazy Circuits(有源汇上下界最小流)
    struts2学习笔记(5)---自己定义拦截器
    【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能
    ConvertHelper与泛型集合
    G711
    关于众筹的一些经验,希望能有帮助
    Java基础 Day14 泛型
    LeetCode144:Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/iOS771722918/p/4478934.html
Copyright © 2011-2022 走看看