1. SEL定义: 是OC特有的数据类型之一 (其他还有BOOL, Block, id类型). 是一个包装方法的这数据类型,我们可以把方法包装成一个SEL类型的数据,去找对应的方法地址并调用方法.
2. SEL的本质: 是存储着方法编号的对象,每个方法都有与之对应的SEL类型的对象,类的对象方法列表里都是SEL类型的方法编号, 我们调用方法时, 系统会根据isa指针找到类的方法列表, 再根据方法列表中的方法编号找到方法在代码区的存储地址, 继而调用方法。 是运行时机制的一种表现,我们知道方法调用其实是消息机制,即给对象发送消息完成方法调用,其实发给对象的消息就是一个SEL数据。简单步骤如下:
把方法包装成SEL数据 -> 根据SEL找到方法地址 -> 完成方法调用。
3. SEL的由来: 根据方法编号查找方法地址, 比字符串类型的方法名速度更快. 过程中会缓存方法,进一步加快下次调用速度。
4. @selector( )的作用: 取出方法方法编号, 并返回. ->方法的编号也叫做ID, 唯一标识符.
5. 创建SEL变量:
方式一:SEL s = @selector(test)
间接调用方法:[objc performSelector:s];
这句代码的意思是: 通过选择器取得test方法的编号并返回, 我们定义一个SEL类型的变量s保存方法编号.
方式二:SEL s1 = NSSelectorFromString(@"test")
间接调用方法:[objc performSelector:s1];
这句代码的意思是: 我们知道一个私有方法的名字 @“test”, 再通过选择器取得私有方法的编号并返回, 然后定义一个SEL类型的变量s1保存方法编号.
6. 系统有一个SEL类型的对象 _cmd, 它代表方法本身,如果在一个方法内部这样写[objc performSelector:_cmd],会引发死循环。