跳到主要内容

简述runtime 如何通过 selector 找到对应的 IMP ?

参考答案:

在 Objective-C 的 runtime 环境中,selector 和 IMP 是两个核心概念。selector 本质上是方法名称,用于在运行时表示方法的名称。而 IMP(Implementation)则是方法的实现,它是一个指向函数的指针。当一个方法被调用时,IMP 会被用来执行该方法。

runtime 通过 selector 找到对应的 IMP 的过程如下:

  1. 类对象中的方法列表:每个类对象中都包含类方法和实例方法的列表。这些列表记录着方法的名称(即 selector)、参数以及实现(即 IMP)。
  2. 使用 selector 查找方法:当我们在代码中使用 @selector() 宏时,它会返回一个 SEL 类型的值,这个值代表了方法的名称。runtime 使用这个 SEL 类型的 selector 在类对象的方法列表中查找对应的方法。
  3. 查找 IMP:一旦在方法列表中找到了与 selector 匹配的方法,runtime 就会获取该方法的 IMP。这个 IMP 是一个指向函数实现的指针,它告诉 runtime 如何执行这个方法。

需要注意的是,SEL 实际上是一个结构体,它包含两个指针:一个是方法的实现(IMP),另一个是方法的名称。然而,在实际应用中,我们更常见的是通过 selector 来查找 IMP,而不是直接从 SEL 结构体中获取。这是因为 SEL 的主要作用是作为方法调用的标识符,而真正的实现细节(即 IMP)是通过 runtime 的机制来查找和绑定的。

综上所述,runtime 通过 selector 找到对应的 IMP 的过程涉及到在类对象的方法列表中查找匹配的方法,并获取该方法的实现指针。这个过程是 Objective-C 动态性和灵活性的重要体现。