美文网首页
runtime打印一个类中所有的实例变量

runtime打印一个类中所有的实例变量

作者: zhake | 来源:发表于2019-11-20 15:37 被阅读0次

OC中类是Class表示的,而Class是一个objc_class类型的结构体,它包含了实例变量列表(objc_ivar_list)、方法列表(objc_method_list)和协议列表(objc_protocol_list).我们可以通过runtime提供的函数来操作这些列表,获取成员变量列表的函数如下:

Ivar *class_copyIvarList(Class cls,unsigned int *outCount)

具体代码如下

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

#import "Person.h"
@interface Person()
@property (nonatomic, strong)NSString *sex;
@end
@implementation Person
- (instancetype)init{
    if (self = [super init]) {
        self.sex = @"male";
    }
    return self;
}

@end

在控制器中获取实例变量并打印

 [super viewDidLoad];
    Person *aperson = [[Person alloc] init];
    aperson.age = 20;
    aperson.name = @"tom";
    unsigned int count = 0;
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    Ivar *list = class_copyIvarList([aperson class], &count);
    for (int i = 0; i < count; i++) {
        NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(list[i])];
        id ivarValue = [aperson valueForKey:ivarName];
        if (ivarValue) {
            dict[ivarName] = ivarValue;
        }else{
            dict[ivarName] = @"";
        }
    }
    for (NSString *ivarName in dict.allKeys) {
        NSLog(@"ivarName:%@,ivarValue:%@",ivarName,dict[ivarName]);
    }

有关runtime 函数的命名和作用,有如下总结:
1)objc开头的函数一般都是高于类的操作,例如注册类,添加类等.
2)class开头的函数是针对objc_class结构体内部进行操作,例如查看实例变量等.
3)object开头的函数主要是对对象进行修改,例如修改Ivar的值、调用某个method等.
4)ivar、property和method开头的函数主要是对实例变量、属性、方法进行操作.

相关文章

  • runtime打印一个类中所有的实例变量

    OC中类是Class表示的,而Class是一个objc_class类型的结构体,它包含了实例变量列表(objc_i...

  • iOS 中 Model 和 JSON 互相转换

    基本原理 利用 runtime 原理,获取模型中所有实例变量列表,根据实例变量以此获取模型中成员变量的名称和属性类...

  • iOS的KVC底层原理(源码分析)

    先了解成员变量、属性、实例变量 实例变量: class类进行实例化出来的对象为实例对象。成员变量: 在{ }中所声...

  • 440.能否向编译后得到的类中增加实例变量?能否向运行时创建的类

    不能向编译后得到的类中增加实例变量!能向运行时创建的类中添加实例变量! 因为编译后的类已经注册在runtime中,...

  • Python实例变量和类变量

    Python实例变量和类变量 类变量(类属性): 类变量属于类所有,所有实例共享一个变量 实例变量(实例属性) 实...

  • 成员变量、实例变量和属性变量

    1、成员变量和实例变量 成员变量:所有在{ }中声明的变量都是成员变量实例变量:实质是指成员变量中所有有指针引用类...

  • Python的类变量和实例变量

    类变量 在所有类的实例之前共享的值实例变量 每个实例单独拥有的变量 这里p1.name="bbb"是实例调用了类变...

  • Runtime

    概念 Runtime就是一个C语言写的API库,通过Runtime这个库,我们可以在程序运行时对类、实例对象、变量...

  • OC Runtime

    Runtime核心之-数据结构 每个类的实例变量都有一个Class isa struct objc_class ...

  • 2019-03-07

    实例变量:已声明的用来复制的变量类变量:类里面的变量,类里面没有的变量可以在类初始化后在外边声明。实例变量可以用类...

网友评论

      本文标题:runtime打印一个类中所有的实例变量

      本文链接:https://www.haomeiwen.com/subject/drmoictx.html