SEL又称选择器,表示的是一个方法的selector的指针。在很多方法名中都可以看到,例如UIControl.h中事件的监听方法:
UIButton *button = [UIButton buttonWithType:(UIButtonTypeCustom)];
[button addTarget:(nullable id) action:(nonnull SEL) forControlEvents:(UIControlEventTouchUpInside)];
action:(nonnull SEL) SEL 定义
typedef struct objc_selector *SEL;
方法的selector用于表示运行时方法的名字。Objective-C在编译时,会根据每个方法的名字、参数列表,生成一个唯一的整型标识,这个标识就是SEL。正因为其具有唯一性,所以在Objective-C的同一个类中,不能存在两个同名的方法,即使参数类型不同也不行。
通过以下生成唯一的整型标识:
- 每个方法名
- 方法参数列表
开发者可以在运行时添加新的selector,也可以在运行时获取已存在的selector。可以通过以下方法获取SEL
- 在运行时注册一个方法,返回SEL 指针
SEL sel_registerName(const char * _Nonnull str)
- 编译器提供的方法
@selector(selector)
- 通过字符串获取SEL
NSSelectorFromString(NSString * _Nonnull aSelectorName)
工程中所有的SEL会组成一个Set集合,Set的特点就是具有唯一性,因此SEL也是唯一的。如果想要查找某个方法,那么只需要找到这个方法所对应的SEL就可以了,SEL实际上就是根据方法名Hash转换的一个字符串。