和SEL一样,IMP实际上也是个函数指针,它指向方法实现的首地址,可以把它理解为方法的具体实现。其定义如下:
id(*IMP)(id,SEL, ...)
SEL指针查找方法,实际上就是查找方法的IMP。由于每个方法对应唯一的SEL,所以可以通过SEL方便快速准确地获取它所对应的IMP。取得IMP之后,就可以像调用普通的C语言函数一样来使用这个函数指针了。
在objc/runtime.h 中定义用于表示的方法结构体
typedef struct objc_method *Method;
struct objc_method {
SEL method_name
char *method_types
IMP method_imp
}
可以看到结构体objc_method包含了一个SEL和IMP,实际上它相当于在SEL和IMP之间作了一个映射。