SEL 选择器

412 阅读1分钟

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

  1. 在运行时注册一个方法,返回SEL 指针
 SEL sel_registerName(const char * _Nonnull str)
  1. 编译器提供的方法
 @selector(selector)
  1. 通过字符串获取SEL
 NSSelectorFromString(NSString * _Nonnull aSelectorName)

工程中所有的SEL会组成一个Set集合Set的特点就是具有唯一性,因此SEL也是唯一的。如果想要查找某个方法,那么只需要找到这个方法所对应的SEL就可以了,SEL实际上就是根据方法名Hash转换的一个字符串