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

  • 相关阅读:
    .NET面试题解析(07)-多线程编程与线程同步
    .NET面试题解析(06)-GC与内存管理
    .NET面试题解析(05)-常量、字段、属性、特性与委托
    .NET面试题解析(04)-类型、方法与继承
    .NET面试题解析(03)-string与字符串操作
    .NET面试题解析(02)-拆箱与装箱
    .NET面试题解析(01)-值类型与引用类型
    StackExchange.Redis使用配置
    X--名称空间详解
    深入浅出话资源
  • 原文地址:https://www.cnblogs.com/layios/p/5371367.html
Copyright © 2011-2022 走看看