1.获取类的成员变量
//定义一个整数来接收,所需获取的类的属性个数
unsigned int count =0;
/*
参数一:对象的类名
参数二:用来接收属性个数的 整型
*/
Ivar *ivars = class_copyIvarList(objc_getClass("类的名称"),&count);
//取出所获取的属性
for(int i = 0; i < count; i++) {
//拿出一个一个的成员变量
Ivar ivar = ivars[i];
//获取属性的名字
const char * name = ivar_getName(ivar);
//将C类型的字符串转换成Object-C类型的字符串
NSString * ocName = [NSString stringWithUTF8String:name];
NSLog(@"%@",ocName);
}
2.获取类的方法
/*
参数一: 对象的类名
参数二: 所要获取的方法
*/
Method imageNamedMethod = class_getClassMethod(objc_getClass("类的名称"),@selector(imageNamed:));
Method xmg_imageNamedMethod = class_getClassMethod(objc_getClass("类的名称"),@selector(xmg_imageNamed:));
//交互方法runtime, 这个很少用
method_exchangeImplementations(imageNamedMethod, xmg_imageNamedMethod);
/*
调用imageNamed -> xmg_imageNamed
调用xmg_imageNamed -> imageNamed
*/
3. 动态添加属性
/*
参数一object:给哪个对象添加属性
参数二key:属性名称
参数三value:属性值
参数四policy:保存存策略
*/
objc_setAssociatedObject(self,@"name", name,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
4.消息机制
//OC
//HKPerson *p = [HKPerson alloc];
//p = [p init];
//C
Person *p = objc_msgSend(objc_getClass("Person"),sel_registerName("alloc"));
p = objc_msgSend(p,sel_registerName("init"));
//调用eat无参数方法
objc_msgSend(p,@selector(eat));
//调用run有参数方法@selector(run:)后依奖填写要传入的参数
objc_msgSend(p,@selector(run:),20);