Objective-C 通过运行时遍历类所有成员变量

Objective-C运行时库提供了非常便利的方法获取其对象运行时所属类及其所有成员变量,并通过KVC进行值的存取。

在某些场合,若想遍历某个对象的所有成员变量的值,或将其转化为NSDictionary这样的key-value集合,亦或将其转化为一个网络请求的POST参数,都可以通过OC的运行时编程来解决。

如将当前类所有成员转化为NSDictionary集合

复制代码

  • (NSDictionary *)toDictionary
    {
    NSMutableDictionary *dictionaryFormat = [NSMutableDictionary dictionary];

    // 取得当前类类型
    Class cls = [self class];

    unsigned int ivarsCnt = 0;
    // 获取类成员变量列表,ivarsCnt为类成员数量
    Ivar *ivars = class_copyIvarList(cls, &ivarsCnt);

    // 遍历成员变量列表,其中每个变量都是Ivar类型的结构体
    for (const Ivar *p = ivars; p < ivars + ivarsCnt; ++p)
    {
    Ivar const ivar = *p;

      // 获取变量名
      NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
      // 若此变量未在类结构体中声明而只声明为Property,则变量名加前缀 '_'下划线
      // 比如 @property(retain) NSString *abc;则 key == _abc;
      
      // 获取变量值
      id value = [self valueForKey:key];
      
      // 取得变量类型
      // 通过 type[0]可以判断其具体的内置类型
      const char *type = ivar_getTypeEncoding(ivar);
      
      if (value)
      {
          [dictionaryFormat setObject:value forKey:key];
      } 
    

    }
    return dictionaryFormat;
    }
    复制代码
    这里是遍历当前类的所有成员变量

还可以通过

    cls = class_getSuperclass(cls);

进入父类遍历成员变量,终止时判断

    if (cls == [NSObject class])
    {
        return;
    }

你可能感兴趣的:(Objective-C 通过运行时遍历类所有成员变量)