博客> IMP 的runtime寻址操作
IMP 的runtime寻址操作
2019-05-24 13:22 评论:0 阅读:371 lvhahaha
ios runtime IMP

IMP 的含义:

Implementation的缩写 IMP 是一个函数指针,这个被指向的函数包含一个接收消息的对象id(self  指针), 调用方法的选标 SEL (方法名),以及不定个数的方法参数,并返回一个id。也就是说 IMP 是消息最终调用的执行代码,是方法真正的实现代码 。

所以消息的传送模式为 1,它首先找到 SEL 对应的方法实现 IMP。因为不同的类对同一方法可能会有不同的实现,所以找到的方法实现依赖于消息接收者的类型。 2, 然后将消息接收者对象(指向消息接收者对象的指针)以及方法中指定的参数传递给方法实现 IMP。 3, 最后,将方法实现的返回值作为该函数的返回值返回。

那么runtime是怎样寻找IMP呢?

runtime提供了两种不同的方法,那么一般优先选择效率高的第一种方法。

1、IMP class_getMethodImplementation(Class cls, SEL name);

2、IMP method_getImplementation(Method m)

cls 某个实力类中的某个方法,name为method_name。 那么有必要介绍下这个方法的含义。

方法的含义

这里所说的方法链表里面存储的是Method 类型的。selector 就是指 Method的 SEL,  address就是指Method的 IMP。 typedef struct objc_method *Method;

typedef struct objc_ method {

    SEL method_name;

    char *method_types;

    IMP method_imp;

}; 一个方法 Method,其包含一个方法选标 SEL – 表示该方法的名称,一个types – 表示该方法参数的类型,一个 IMP  - 指向该方法的具体实现的函数指针。

总结: 通过此方法 IMP class_getMethodImplementation(Class cls, SEL name);就可以寻找到某个类的某个方法的IMP,修改此IMP可以替换或者更改次方法的实现。

收藏
2
sina weixin mail 回到顶部