美文网首页夯实基础OC 底层面试
runtime中,SEL、Method 和 IMP有什么区别,使

runtime中,SEL、Method 和 IMP有什么区别,使

作者: 时光浅影 | 来源:发表于2020-07-28 08:57 被阅读0次

    它们之间的关系:一个类(Class)持有一个分发表,在运行期分发消息,表中的每一个实体代表一个方法(Method),它的名字叫做选择子(SEL),对应着一种方法实现(IMP)。具体的分析如下
    SEL:
    定义:typedef struct objc_selector *SEL,代表方法的名称,类成员方法的指针,方法编号。仅以名字来识别,SEL代表方法在 Runtime 期间的标识符。为 SEL 类型,虽然 SEL 是 objc_selector 结构体指针,但实际上它只是一个 C 字符串。在类加载的时候,编译器会生成与方法相对应的选择子,并注册到 Objective-C 的 Runtime 运行系统。不论两个类是否存在依存关系,只要他们拥有相同的方法名,那么他们的SEL都是相同的。

    //比如,有n个viewcontroller页面,每个页面都有一个viewdidload,每个页面的载入,肯定都是不尽相同的。但是我们可以通过打印,观察发现,这些viewdidload的SEL都是同一个.
    SEL s = @selector(viewDidLoad);
        NSLog(@"地址 %p",s);
    

    IMP:定义:typedef id (*IMP)(id, SEL, ...),代表函数指针,即函数执行的入口。该函数使用标准的 C 调用。第一个参数指向 self(它代表当前类实例的地址,如果是类则指向的是它的元类),作为消息的接受者;第二个参数代表方法的选择子;... 代表可选参数,前面的 id 代表返回值。

    Method:定义:typedef struct objc_method *Method,Method 对开发者来说是一种不透明的类型,被隐藏在我们平时书写的类或对象的方法背后。它是一个 objc_method 结构体指针,我们可以看到该结构体中包含一个SEL和IMP,实际上相当于在SEL和IMP之间作了一个映射。有了SEL,我们便可以找到对应的IMP,从而调用方法的实现代码。 objc_method 的定义为

     /// Method
    struct objc_method {
        SEL method_name; 
        char *method_types;
        IMP method_imp;
     };
    

    方法名 method_name 类型为 SEL,前面提到过相同名字的方法即使在不同类中定义,它们的方法选择器也相同。
    方法类型 method_types 是个 char 指针,其实存储着方法的参数类型和返回值类型,即是 Type Encoding 编码。
    method_imp 指向方法的实现,本质上是一个函数的指针,就是前面讲到的 Implementation。

    原文链接:https://www.jianshu.com/p/be4a1c873492

    相关文章

      网友评论

        本文标题:runtime中,SEL、Method 和 IMP有什么区别,使

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