iOS SEL、Method 和 IMP

作者: 学不来的凡人 | 来源:发表于2021-03-26 08:17 被阅读0次

面试题:Runtime中,SEL、Method 和 IMP有什么区别,使用场景?

答:它们之间的关系可以这么解释:一个类(Class)持有一个分发表,在运行期分发消息,表中的每一个实体代表一个方法(Method),它的名字叫做选择子(SEL),对应着一种方法实现(IMP)。具体的分析如下:

SEL:定义: typedef struct objc_selector *SEL,代表方法的名称。仅以名字来识别。翻译成中文叫做选择子或者选择器,选择子代表方法在 Runtime期间的标识符。为 SEL类型,虽然 SEL是 objc_selector 结构体指针,但实际上它只是一个 C 字符串。在类加载的时候,编译器会生成与方法相对应的选择子,并注册到 Objective-C的 Runtime 运行系统。不论两个类是否存在依存关系,只要他们拥有相同的方法名,那么他们的SEL都是相同的。比如,有n个viewcontroller页面,每个页面都有一个viewdidload,每个页面的载入,肯定都是不尽相同的。但是我们可以通过打印,观察发现,这些viewdidload的SEL都是同一个
SEL sel = @selector(methodName); // 方法名字 NSLog(@"address = %p",sel);// log输出为 address = 0x1df807e29因此类方法定义时,尽量不要用相同的名字,就算是变量类型不同也不行。否则会引起重复,例如:

-(void)setWidth:(int)width; -(void)setWidth:(double)width; 

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 指向方法的实现,本质上是一个函数的指针

SEL selector的简写,俗称方法选择器,实质存储的是方法的名称
IMP implement的简写,俗称方法实现,看源码得知它就是一个函数指针
Method 对上述两者的一个包装结构.

相关文章

  • iOS方法交换研究

    1、Class/SEL/Method/IMP Class+SEL=>Method=>IMP,... 2、class...

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

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

  • iOS SEL、Method 和 IMP

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

  • SEL、IMP和Method

    SEL : 方法选择器,SEL是函数objc_msgSend第二个参数的数据类型,表示方法选择器 ,在ios开发中...

  • SEL、IMP、Method

    先说一个大家都熟悉的 SEL SEL:表示一个selector的指针。系统在编译过程中,会根据方法的名字以及参数...

  • Method Swizzling & KVC

    一、Method Swizzling(方法交换) Method Swizzling本质上就是对方法的IMP和SEL...

  • iOS-底层原理18:Method-Swizzling 方法交换

    method-swizzling 是什么? Method Swizzling本质上就是对方法的IMP和SEL进行交...

  • Swizzle黑魔法

    参考链接: 1、iOS黑魔法 Method Swizzling本质上就是对IMP和SEL进行交换。 那就回顾一下m...

  • SEL、Method和IMP区别

    它们之间的关系可以这么解释:一个类(Class)持有一个分发表,在运行期分发消息,表中的每一个实体代表一个方法(M...

  • runtime 学习笔记(三)

    今日搞清楚三个东西SEL、IMP、Method (一、)SEL SEL是selector在Object-C...

网友评论

    本文标题:iOS SEL、Method 和 IMP

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