美文网首页
SEL的使用

SEL的使用

作者: 幽玄727 | 来源:发表于2020-11-20 10:51 被阅读0次
//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就是一个函数指针,然后执行这个方法


相关文章

网友评论

      本文标题:SEL的使用

      本文链接:https://www.haomeiwen.com/subject/rwkdiktx.html