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

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打印一个类中所有的实例变量)