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