Runtime自我总结

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);

你可能感兴趣的:(Runtime自我总结)