CTMediator|CTMediator 原理详解(一)
最近开始用CTMetidor
来做App模块化
,顺便研究一下它的实现原理
CTMetidor
源码中经常出现如下关键词:NSSelectorFromString
、NSClassFromString
、SEL
这些是个啥???在理解CTMediator原理之前我们先弄懂这么几个概念:
Method
先来看一下Method相关的定义
typedef struct objc_method *Method
struct objc_method{
SEL method_nameOBJC2_UNAVAILABLE;
// 方法名
char *method_typesOBJC2_UNAVAILABLE;
IMP method_impOBJC2_UNAVAILABLE;
// 方法实现
}
文章图片
Method结构 我们可以看到该结构体中包含一个
SEL
和IMP
,实际上相当于在SEL
和IMP
之间作了一个映射,将SEL
和IMP
进行了关联,通过SEL
我们便可以找到对应的IMP
,从而调用方法的实现代码。SEL(selector)
- 方法编号,对方法名hash化的字符串
- 无论什么类里,只要方法名相同,
SEL
就相同。项目里的所有SEL
都保存在一个NSSet集合里(NSSet集合里的元素不能重复),所以查找对应方法,只要找到对应的SEL
就可以了。
每个方法名有对应的唯一seletor,其如何获取SEL?SEL
相同,但对应的IMP
函数指针不同。
SEL s1= @selector(test);
SEL s2 = NSSelectorFromString(@“test”)
以上两个方法是等价的
IMP (implement)
- 一个函数指针,保存了方法的地址,内部实现:
typedef id (*IMP)(id, SEL, ...);
- 包含
id
(消息接受者,也就是对象),SEL
(方法的名字),参数
【CTMediator|CTMediator 原理详解(一)】执行对应的方法:
[object test];
// @selector(test) 是一个C的字符串
[object performSelector:@selector(test)]];
// 转换成如下实现方式
objc_msgSend(object,@selector(test))
总结
- NSClassFromString 通过字符串的名称来获取一个类,可以根据Target来进行获取
- NSSelectorFromString 通过字符串(已存在的方法名称)获取一个SEL
推荐阅读
- 做一件事情的基本原理是什么()
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- 【读书笔记】贝叶斯原理
- SG平滑轨迹算法的原理和实现
- “写作宝典”《金字塔原理》之读书笔记
- 虚拟DOM-Diff算法详解
- LSTM网络层详解及其应用实例
- OC:|OC: WKWebView详解
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了