美文网首页selector
iOS 方法底层探索-SEL方法编号编译加载

iOS 方法底层探索-SEL方法编号编译加载

作者: 想飞的菜鸟 | 来源:发表于2020-09-29 14:41 被阅读0次

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

每一个继承于NSObject的类都能自动获得runtime的支持。在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的.在这个结构体中有包括了指向其父类类定义的指针以及 dispatch table. dispatch table是一张SEL和IMP的对应表。dispatch table 仅仅包含了当前类的selector和MethodIMP的地址。

方法编号SEL最后还是要通过dispatch table表寻找到对应的IMP,IMP就是一个函数指针,然后执行这个方法。

1.获取方法编号
(1)SEL methodID = @selector(方法名);
(2)SEL methodID = NSSelectorFromString(methodName);
注:@selector是查找当前类(含子类)的方法。

2.通过方法编号执行该编号的方法
[self performSelector:methodID withObject:nil];

3.通过方法编号获取该编号的方法名
NSString*methodName = NSStringFromSelector(methodID);

4.通过方法编号获得IMP指针
IMP methodPoint = [self methodForSelector:methodID];

5.执行IMP
void (*func)(id, SEL, id) = (void *)imp;
func(self, methodName,param);

有了SEL这个中间过程,我们可以针对方法编号和IMP指针映射做操作,也就是说我们可以一个SEL指向不同的函数指针,这样就可以完成一个方法名在不同时候执行不同的函数体。另外可以将SEL作为参数传递给不同的类执行。也就是说我们某些业务我们只知道方法名但需要根据不同的情况让不同类执行的时候,SEL可以帮助我们实现。

相关文章

  • iOS 方法底层探索-SEL方法编号编译加载

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

  • SEL和IMP的区别

    IOS SEL 其中@selector()是取类方法的编号,取出的结果是SEL类型。SEL:类成员方法的指针,与...

  • SEL和IMP两者有什么联系

    SEL 是方法编号,即方法名称,在dyld加载镜像时,通过read_image方法加载到内存的表中了。 IMP 是...

  • IOS SEL(@selector)原理以及应用

    IOS SEL(@selector)原理其中@selector()是取类方法的编号,取出的结果是SEL类型。SE...

  • iOS:SEL与IMP,方法与函数

    SEL与IMP SEL: 类成员方法的指针,可以理解 @selector()就是取类方法的编号通过方法名获取SEL...

  • HOOK技术

    iOS中HOOK技术的几种方式 Method Swizzle利用OC的Runtime特性,动态改变SEL(方法编号...

  • runtime

    Runtime 一、消息机制 类 ——> SEL(方法编号) ——> IMP(函数指针) ——> 方法(函数) *...

  • Runtime运行机制

    一、RunTime 简介 二、RunTime作用1.发送消息 SEL:方法编号,根据方法编号,就可以找到对应的方法...

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

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

  • iOS 底层探索 - 方法

    iOS 底层探索系列iOS 底层探索- alloc & initiOS 底层探索 - calloc 和 isaiO...

网友评论

    本文标题:iOS 方法底层探索-SEL方法编号编译加载

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