SEL的使用
2020-11-20 本文已影响0人
幽玄727
//action 方法名 param 参数
- (void)action:(NSString *)action param:(NSDictionary *)param
{
SEL sel = NSSelectorFromString([NSString stringWithFormat:@"%@Act:",action]);
if ([self respondsToSelector:sel]) {
IMP imp = [self methodForSelector:sel];
void (*func)(id,SEL,NSDictionary *) = (void *)imp;
func(self,sel,param);
}
}
//使用 例如上面 action 为 "onClick"
- (void)onClickAct:(NSDictionary *)param
{
NSLog(@"%@",param)
}
```
SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。
IMP:一个函数指针,保存了方法的地址
IMP和SEL关系
每一个继承于NSObject的类都能自动获得runtime的支持。在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的.在这个结构体中有包括了指向其父类类定义的指针以及 Dispatch table. Dispatch table是一张SEL和IMP的对应表。[(http://blog.csdn.net/fengsh998/article/details/8614486)](https://link.jianshu.com?t=http://blog.csdn.net/fengsh998/article/details/8614486)
也就是说方法编号SEL最后还是要通过Dispatch table表寻找到对应的IMP,IMP就是一个函数指针,然后执行这个方法