美文网首页
iOS中的 SEL 和 IMP

iOS中的 SEL 和 IMP

作者: Ahri阿狸 | 来源:发表于2018-05-02 15:48 被阅读0次

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是一个函数指针,然后去执行这个方法;

相关文章

  • iOS中的 SEL 和 IMP

    SEL SEL是选择器(selector)的一个类型。选择器就是指向方法的一个指针, OC在编译的时候,会根据方法...

  • iOS IMP和SEL

    SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。 I...

  • SEL、IMP和Class

    转载自:Objective-C中的SEL、IMP和Class类型 1、SEL类型 例子: SEL say; SEL...

  • OC底层原理探索—Method Swizzling方法交换

    sel 和 imp 在讲Method Swizzling前先讲一下sel 和 imp sel:方法编号,在read...

  • iOS SEL 和 IMP 关系?

    SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。 I...

  • ios开发SEL和IMP

    SEL的基本使用方法 创建SEL: SEL s1 = @selector(test1); SELs2=NSSele...

  • iOS SEL、Method 和 IMP

    面试题:Runtime中,SEL、Method 和 IMP有什么区别,使用场景? 答:它们之间的关系可以这么解释:...

  • iOS中的class,SEL,IMP

    最近在看一些底层的东西,之前一直看到SEL,IMP等概念也不曾深究,今天看了很多资料,就顺手整理一下,讲的不够细致...

  • iOS开发-iOS中的SEL,IMP和isa

    SEL:类成员方法的指针。(不同于C语言中的函数指针,函数指针直接保存了方法的地址,SEL只是方法编号) IMP:...

  • 3-1 runtime-isa数据结构

    IMP:一个函数指针,保存了方法的地址 一张SEL和IMP的对应表 通过SEL可以找到IMP runtime ...

网友评论

      本文标题:iOS中的 SEL 和 IMP

      本文链接:https://www.haomeiwen.com/subject/nbdcrftx.html