SEL:类成员方法的指针,方法编号
IMP:函数指针,保存了方法的地址
- 继承于NSObject的类都被runtime所支持
在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的.在这个结构体中有包括了指向其父类类定义的指针以及 Dispatch table. Dispatch table是一张SEL和IMP的对应
- IMP和SEL关系
SEL(方法编号)最终会通过Dispatch table表寻找到对应的IMP(函数指针)
Dispatch table表存放SEL和IMP的对应
1.获取方法编号
SEL methodsID=@selector(Click);
2.执行编号所对应的方法
[self performSelector:methodsID withObject:nil];
3.通过编号获取方法
NSString*methodName = NSStringFromSelector(methodsID);
4.获取IMP
IMP methodsGet = [self methodForSelector:methodsID];
IMP methodsGet = [NSObject instanceMethodForSelector:@selector(methodsID)]
5.IMP使用
methodsGet();
为什么不直接获得函数指针,而要从SEL这个编号走一圈再回到函数指针呢?
有了SEL这个中间过程,我们可以对一个编号和什么方法映射做些操作,也就是说我们可以一个SEL指向不同的函数指针,这样就可以完成一个方法名在不同时候执行不同的函数体。另外可以将SEL作为参数传递给不同的类执行。也就是说我们某些业务我们只知道方法名但需要根据不同的情况让不同类执行的时候,SEL可以帮助我们。
网友评论