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开头的函数主要是对实例变量、属性、方法进行操作.
网友评论