SEL
SEL是选择器(selector)的一个类型。选择器就是指向方法的一个指针,
OC在编译的时候,会根据方法的签名就是参数类型,自己生成一个ID 用来却分这个方法的唯一一个ID。这个ID 就是SEL类型的。在运行的时候回通过方法的ID来查钊方法。 方法签名相同则他们的ID也是相同的。 不管是父类还是子类,还是其他类,只要签名相同ID也一一样相同。
类型识别:
在OC中要得到方法SEL 可以直接使用
1. @ selector指示符号,SEL act = @selector(setAge:);
2. 也可是是函数:NSSelectorFromString(NSString *)
3. (NSString *)NSStringFromSeletor (SEL)
eg:
SEL eat = NSSelectorFromString(@"draw")
NSString *methodName = NSStringFromSeletor (eat);
IMP (implementation)
IMP:一个函数指针,保存了方法地址;
它是OC方法实现代码块的地址,通过他可以直接访问任意一个方法。免去发送消息的代码,IMP声明:
typedef id (&IMP)(id,SEL,...);
IMP 是一个函数指针,这个被只想的函数包含一个接收消息的对象id(self 指针),调用方法的选标SEL(方法名),以及不定个数的方法参数,并返回一个id.
EL和IMP的关系
每一个继承于NSobject的类都能自动获的runtime的支持,在这样的类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是编译器编译时为类创建的.在这个结构体中包括了指向其父类类定义的指针及Dispatch table,Dispatch table 是一张SEL和IMP的对应表(可以参考:(http://blog.csdn.net/fengsh998/article/details/8614486)) ; 也就是说方法编号SEL最后还要通过Dispatch table表找到对应的IMP,IMP是一个函数指针,然后去执行这个方法;
网友评论