本文最后更新于:2021年12月22日 中午
                
              
            
            
              
一 概念
- SEL
 方法名(编号)
- IMP
 一个函数指针,保存了方法的地址
- @selector(方法名)
 获取方法的编号,结果是SEL类型。他的行为基本可以等同于C语言中的函数指针
二 区别
C语言中,可以直接把函数名赋值给一个函数指针,而且函数指针直接保存了函数地址
Objc中的类不能直接应用函数指针,只能使用@selector来获取,获取的是方法的编号
三 原理
方法以@selector作为索引,@selector的数据类型是SEL,对应每个方法的编号,当我们寻找方法的时候使用的是这个方法编号。类中存在一个methodLists专门用来存放方法实现IMP和SEL的映射。方法编号SEL通过Dispatch table表寻找到对应的IMP,IMP就是一个函数指针,然后执行这个方法。
| 12
 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;
 
 };
 
 
 | 
| 12
 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;
 
 };
 
 | 
四 相关
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | class   返回对象的类;
 isKindOfClass 和 isMemberOfClass检查对象是否在指定的类继承体系中;
 
 respondsToSelector 检查对象能否相应指定的消息;
 
 conformsToProtocol 检查对象是否实现了指定协议类的方法;
 
 methodForSelector  返回指定方法实现的地址。
 
 performSelector:withObject 执行SEL 所指代的方法。
 
 
 | 
联系方式
邮箱: xiebangyao_1994@163.com
相关账号: