zoukankan      html  css  js  c++  java
  • 浅谈runtim的归档和解档

    自定义一个Person类

     Person.h里面

    #import <Foundation/Foundation.h>

    //遵循一个NSCoding协议

    @interface Person : NSObject<NSCoding>

    //定义三个person类的属性

    @property(strong,nonatomic)NSString *name;

    @property(assign,nonatomic)int age;

    @property(strong,nonatomic)NSString *addr;

    @end

     Person.m里面

    #import "Person.h"

    #import <objc/runtime.h>

    @implementation Person

    //实现编码方法

    -(void)encodeWithCoder:(NSCoder *)aCoder

    {

        unsigned int count;

        //获取指向当前类的所有属性的指针

        objc_property_t *properties=class_copyPropertyList([self class], &count);

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

        {

            //获取指向当前类的一个属性的指针

            objc_property_t property=properties[i];

            //获取C字符串属性名

            const char *name=property_getName(property);

            //C字符串转OC字符串

            NSString *propertyName=[NSString stringWithUTF8String:name];

            //通过关键字取值

            NSString *propertyValue=[self valueForKey:propertyName];

            //对属性进行编码

            [aCoder encodeObject:propertyValue forKey:propertyName];

        }

        

        //释放

        free(properties);

    }

    //实现解码方法

    -(instancetype)initWithCoder:(NSCoder *)aDecoder

    {

        unsigned int count;

        //获取指向当前类的所有属性的指针

        objc_property_t *properties=class_copyPropertyList([self class], &count);

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

        {

            //获取指向当前类的一个属性的指针

            objc_property_t property=properties[i];

            //获取C字符串属性名

            const char *name=property_getName(property);

            //C字符串转OC字符串

            NSString *propertyName=[NSString stringWithUTF8String:name];

            //通过关键字取值

            NSString *propertyValue=[self valueForKey:propertyName];

            //对属性进行解码

            [self setValue:propertyValue forKey:propertyName];

        }

        //释放

        free(properties);

        return self;

    }

    //归档和结档

    -(void)test

    {

        Person *person=[[Person alloc] init];

        person.name=@"小明";

        person.age=11;

        person.addr=@"贵阳";

        

        NSString *path=[NSString stringWithFormat:@"%@/archive",NSHomeDirectory()];

        [NSKeyedArchiver archiveRootObject:person toFile:path];

        Person *unarchiverPerson=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

        NSLog(@"unarchiverPerson=%@ %@",path,unarchiverPerson);

    }

    @end

  • 相关阅读:
    2020 年最棒的 9 个 Java 框架,哪个最香?
    CTO:不要在 Java 代码中写 set/get 方法了,逮一次罚款
    面试常考:Java中synchronized和volatile有什么区别?
    树莓派3B装ubuntu server后开启wifi
    转:程序内存空间(代码段、数据段、堆栈段)
    环境变量IFS
    python之格式化字符串速记整理
    logging模块简单用法
    理解正则表达式的匹配关系
    cut和tr命令的联合使用
  • 原文地址:https://www.cnblogs.com/layios/p/5371367.html
Copyright © 2011-2022 走看看