SEL:类成员方法的指针。(不同于C语言中的函数指针,函数指针直接保存了方法的地址,SEL只是方法编号)
IMP:一个函数指针,保存了方法的地址。
IMP和SEL关系:
每一个继承于NSObject的类都能自动获得runtime的支持。在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的。在这个结构体中又包括指向其父类类定义的指针以及Dispatch table.Dispatch table是一张SEL和IMP的对应表。也就是说方法编号SEL最后还是要通过Dispatch table表寻找对应的IMP,IMP就是一个函数指针,然后执行这个方法。
SEL相关问题:
通过@selector()可以取到类方法的编号。 SEL methodId = @selector(func1);
获取编号后如何执行对应方法:[self performSelector:methodIdWithObject:nil];
通过编号获取方法:NSString *methodName = NSStringFromSelector(methodId);
IMP相关问题:
获得:IMP methodPoint = [self methodForSelector:methodId];
methodPoint();
为什么不直接获得函数指针,而要从SEL这个编号走一圈再回到函数指针呢?
有了SEL这个中间过程,我们可以对一个编号和什么方法映射做些操作,也就是说我们可以一个SEL指向不同的函数指针,这样就可以完成一个方法名在不同时候执行不同的函数体。另外可以将SEL作为参数传递给不同的类执行。
isa:字面意思就是 is a ,是一个什么。