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

  • 相关阅读:
    POJ 1502 MPI Maelstrom
    BNUOJ4359 无爱编号
    BNUOJ 6727 Bone Collector
    SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考
    聊聊C语言和ABAP
    小技巧:不用任何媒体处理软件进行视频压缩
    如何处理Docker错误消息:please add——insecure-registry
    如何处理Docker的错误消息request canceled:Docker代理问题
    推荐一个高大上的网易云音乐命令行播放工具:musicbox
    Windows下使用python库 curses遇到错误消息的解决方案
  • 原文地址:https://www.cnblogs.com/wudan7/p/7422225.html
Copyright © 2020-2023  润新知