面试题答案
一键面试SEL含义
SEL(选择器)是一个指向方法的selector(方法名)的指针。它本质上是一个唯一标识方法的ID,通过@selector()编译器指令来获取。例如,如果有一个方法 - (void)sayHello;
,可以通过 @selector(sayHello)
得到对应的SEL。SEL使得系统可以快速定位到要调用的方法,不同类中相同名字的方法会对应相同的SEL。
IMP含义
IMP(实现)是一个函数指针,它指向方法实现的具体代码。当某个类接收到一条消息时,最终会通过IMP找到并执行对应的方法实现代码。IMP实际指向的函数原型是 id (*IMP)(id, SEL, ...)
,第一个参数是self(消息接收者),第二个参数是SEL(方法选择器),后面是方法的其他参数。
两者联系
- SEL是方法的标识,IMP是方法的实现。当向一个对象发送消息时,运行时系统首先根据对象的isa指针找到类的方法列表,在方法列表中通过SEL快速查找对应的IMP。
- 不同类对于相同SEL可能有不同的IMP。例如,子类可以重写父类的方法,此时父类和子类对于同一个SEL(方法名相同),会有不同的IMP指向不同的具体实现代码。