zoukankan      html  css  js  c++  java
  • runtime之实现对象序列化

    /*
    iOS序列化,将对象转成二进制,保存到本地
    */

    定义一个对象,让它实现NSCoding协议,保证对象的编码和解码,person有三个属性

    @interface Person : NSObject <NSCoding>
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) int age;
    @property (nonatomic, copy) NSString *gender;
    @end

    #import "Person.h"
    #import <objc/message.h>

    @implementation Person
    //编码
    - (void)encodeWithCoder:(NSCoder *)aCoder
    {
      /*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
      [aCoder encodeObject:_name forKey:@"name"];
      [aCoder encodeInt:_age forKey:@"age"];
      [aCoder encodeObject:_gender forKey:@"gender"];
      */

      /*利用runtime*/
      unsigned int count = 0;
      Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
      for (int i = 0; i < count; i ++) {
        Ivar ivar = ivars[i]; //得到第i个属性
        const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
        NSString *key = [NSString stringWithUTF8String:paramName];
        //得到属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
        id value = [self valueForKey:key];
        [aCoder encodeObject:value forKey:key]; //把对应的值设置进去
      }
    }
    //解码
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
      self = [super init];
      if (self) {

        /*原始写法,需要将对应的属性一个个设置一遍,若有很多属性,就会很麻烦,不灵活, 而且还要设置key,取的时候不小心写错的话,就会有问题
        _name = [aDecoder decodeObjectForKey:@"name"];
        _age = [aDecoder decodeIntForKey:@"age"];
        _gender = [aDecoder decodeObjectForKey:@"gender"];
        */

        /*利用runtime*/
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([Person class], &count); //得到Person所有的属性列表,ivars指向第0个属性
        for (int i = 0; i < count; i ++) {
          Ivar ivar = ivars[i]; //得到第i个属性
          const char *paramName = ivar_getName(ivar); //得到属性名,带下划线的
          NSString *key = [NSString stringWithUTF8String:paramName];
          //将key对应的属性进行解码
          id value = [aDecoder decodeObjectForKey:key];
          //设置属性的值,通过KVC,KVC会先去找没有下划线的属性名,若没有找到,就去找带下划线的属性名,如age属性,KVC会先找age,若找不到,则去找_age
          [self setValue:value forKey:key];
        }
      }
      return self;
    }

  • 相关阅读:
    重新梳理HTML基础知识
    Bootstrap响应式栅格系统的设计原理
    php 循环爬虫 or 持久执行任务 总断掉服务 解决,flush(),ob_flush()的组合使用
    Linux中工作目录切换命令
    Linux中系统状态检测命令
    Linux系统中rm删除命令
    Linux中touch命令使用(创建文件)
    Linux中 mkdir 创建文件夹命令
    Linux 中 cp 命令(文件复制)
    Linux中 mv(文件移动)
  • 原文地址:https://www.cnblogs.com/wudan7/p/7422225.html
Copyright © 2011-2022 走看看