您的当前位置:首页正文

iOS 利用runtime获取类中的属性、成员变量、方法

来源:华拓网

前面已经讲过好几个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;

}