一、在objc/message.h中常用的运行时函数
#import <objc/message.h>
/**
*1.对象调用方法
*/
id objc_msgSend(id self, SEL op, ...)
id self://调用方法的对象
SEL://调用的方法
...://方法的参数
//示例:(在某的下拉刷新中有用到)
Person p = [[Person alloc] init];
[p setAge:20];
objc_msgSend(p, [email protected](setAge:), 20);//等价于上句
二、在objc/runtime.h中常用的运行时函数
#import <objc/runtime.h>
/**
*2.获取成员变量
*/
//获取成员变量的指针数组和个数
Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
Class cls:类名
unsigned int *outCount:传入整形的地址
//获取成员变量名
const char *ivar_getName(Ivar v)
//获取成员类型
const char *ivar_getTypeEncoding(Ivar v)
//示例:(在字典转模型的第三方框架中就是用这个函数实现的)
// Ivar : 成员变量
unsigned int count = 0;
// 获得所有的成员变量
Ivar *ivars = class_copyIvarList([HMPerson class], &count);
for (int i = 0; i<count; i++) {
// 取得i位置的成员变量
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
const char *type = ivar_getTypeEncoding(ivar);
NSLog(@"%d %s %s", i, name, type);
}
/**
*3.为成员变量赋值
*/
//为私有成员变量赋值
- (void)willChangeValueForKey:(NSString *)key;
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
- (void)didChangeValueForKey:(NSString *)key;
//获取私有成员变量
id objc_getAssociatedObject(id object, const void *key)
//示例:(在某下拉刷新第三方框架中利用这个函数为UIScrollView动态的添加了HeaderView和FooterView)
static char MJRefreshHeaderViewKey;
static char MJRefreshFooterViewKey;
- (void)setHeader:(MJRefreshHeaderView *)header {
[self willChangeValueForKey:@"MJRefreshHeaderViewKey"];
objc_setAssociatedObject(self, &MJRefreshHeaderViewKey,
header,
OBJC_ASSOCIATION_ASSIGN);
[self didChangeValueForKey:@"MJRefreshHeaderViewKey"];
}
- (MJRefreshHeaderView *)header {
return objc_getAssociatedObject(self, &MJRefreshHeaderViewKey);
}
- (void)setFooter:(MJRefreshFooterView *)footer {
[self willChangeValueForKey:@"MJRefreshFooterViewKey"];
objc_setAssociatedObject(self, &MJRefreshFooterViewKey,
footer,
OBJC_ASSOCIATION_ASSIGN);
[self didChangeValueForKey:@"MJRefreshFooterViewKey"];
}
- (MJRefreshFooterView *)footer {
return objc_getAssociatedObject(self, &MJRefreshFooterViewKey);
}