前面已经讲过好几个runtime的方法,本次通过一个例子来讲一个runtime获取某个类的所有属性、成员变量、方法。
首先要新建一个类Person
在类中声明一些属性和方法
#import@interface Person : NSObject
//姓名
@property (strong,nonatomic) NSString *name;
//年龄
@property (assign,nonatomic) int age;
//地址
@property (strong,nonatomic) NSString *address;
//籍贯
@property (strong,nonatomic) NSString *native;
//身高
@property (assign,nonatomic) float height;
//工作
@property (strong,nonatomic) NSString *job;
//工资
@property (assign,nonatomic) float salary;
//吃
-(void)eat;
//睡
-(void)sleep;
//工作
-(void)work;
//唱歌
-(void)sing;
@end
在类的.m文件中对方法进行实现
然后在.m文件中#import "Person" 和 #import<objc/runtime.h>
#import#import "Person.h"#importint main(int argc, const char * argv[]) {
@autoreleasepool {
Person * person = [[Person alloc] init];
person.name = @"张三";
person.age =26;
person.address = @"广东广州";
person.native =@"福建";
person.height = 178;
person.salary = 6800.2;
person.job = @"工程师";
//获取该类的所有变量
unsigned count;
Ivar * ivars = class_copyIvarList([Person class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
//获取成员变量的C语言的字符串
const char * name = ivar_getName(ivar);
//将C的字符串转为OC的
NSString * ivarName = [NSString stringWithUTF8String:name];
NSLog(@"成员变量名%d === %@",i,ivarName);
}
free(ivars);
//获取所有的属性名
objc_property_t * propertier = class_copyPropertyList([Person class], &count);
for ( int i = 0; i < count; i++) {
objc_property_t property = propertier[i];
//获取属性的C语言字符串
const char * name = property_getName(property);
//将C的字符串转成OC的字符串
NSString * propertyName = [NSString stringWithUTF8String:name];
NSLog(@"属性名%d==%@",i,propertyName);
}
free(propertier);
//获取类的所有方法
Method * methods = class_copyMethodList([Person class], &count);
for (int i = 0; i < count; i++) {
Method method = methods[i];
//获取方法的指针
SEL methodSEL = method_getName(method);
//获取C语言的方法名
const char * name = sel_getName(methodSEL);
//将C的字符串转换成OC的
NSString * methodName = [NSString stringWithUTF8String:name];
NSLog(@"%d== %@",i,methodName);
}
free(methods);
//声明一个指针,
void(*pp)(id self,SEL _cmd);
//获取person对象 eat方法的IMP并将该方法对应的地址赋值给变量
pp = (void(*)(id self,SEL _cmd))[person methodForSelector:@selector(eat)];
//调用方法
pp(person,@selector(eat));
}
return 0;
}