【iOS笔记】【18】SEL的使用与原理

本文最后更新于:2021年12月22日 中午

【主页】系列文章目录

【iOS笔记】系列目录


一 概念

  • SEL
    方法名(编号)
  • IMP
    一个函数指针,保存了方法的地址
  • @selector(方法名)
    获取方法的编号,结果是SEL类型。他的行为基本可以等同于C语言中的函数指针

二 区别

C语言中,可以直接把函数名赋值给一个函数指针,而且函数指针直接保存了函数地址
Objc中的类不能直接应用函数指针,只能使用@selector来获取,获取的是方法的编号

三 原理

方法以@selector作为索引,@selector的数据类型是SEL,对应每个方法的编号,当我们寻找方法的时候使用的是这个方法编号。类中存在一个methodLists专门用来存放方法实现IMP和SEL的映射。方法编号SEL通过Dispatch table表寻找到对应的IMP,IMP就是一个函数指针,然后执行这个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct objc_class {

    struct objc_class super_class;  /*父类*/

    const char *name;                 /*类名字*/

    long version;                   /*版本信息*/

    long info;                        /*类信息*/

    long instance_size;               /*实例大小*/

    struct objc_ivar_list *ivars;     /*实例参数链表*/

    struct objc_method_list **methodLists;  /*方法链表*/

    struct objc_cache *cache;               /*方法缓存*/

    struct objc_protocol_list *protocols;   /*协议链表*/

};

1
2
3
4
5
6
7
8
9
10
11
typedef struct objc_method *Method;

typedef struct objc_ method {

SEL method_name; //方法名

char *method_types; //参数类型

IMP method_imp; //方法实现

};

四 相关

1
2
3
4
5
6
7
8
9
10
11
12
class   返回对象的类;

isKindOfClassisMemberOfClass检查对象是否在指定的类继承体系中;

respondsToSelector 检查对象能否相应指定的消息;

conformsToProtocol 检查对象是否实现了指定协议类的方法;

methodForSelector  返回指定方法实现的地址。

performSelector:withObject 执行SEL 所指代的方法。


联系方式

邮箱: xiebangyao_1994@163.com

相关账号: