4.SEL和@selector( )关键字

2016-12-21  本文已影响34人  Roader

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],会引发死循环。

上一篇 下一篇

猜你喜欢

热点阅读