最近開始用
CTMetidor
來作App模塊化
,順便研究一下它的實現原理bash
CTMetidor
源碼中常常出現以下關鍵詞:NSSelectorFromString
、NSClassFromString
、SEL
這些是個啥???模塊化
在理解CTMediator原理以前咱們先弄懂這麼幾個概念:函數
先來看一下Method相關的定義ui
typedef struct objc_method *Method
struct objc_method{
SEL method_name OBJC2_UNAVAILABLE; // 方法名
char *method_types OBJC2_UNAVAILABLE; // 函數的返回值和參數
IMP method_imp OBJC2_UNAVAILABLE; // 方法的具體實現
}
複製代碼
咱們能夠看到該結構體中包含一個SEL
和IMP
,實際上至關於在SEL
和IMP
之間做了一個映射,將SEL
和IMP
進行了關聯,經過SEL
咱們即可以找到對應的IMP
,從而調用方法的實現代碼。spa
方法編號,對方法名hash化的字符串指針
不管什麼類裏,只要方法名相同,SEL
就相同。項目裏的全部SEL
都保存在一個NSSet集合裏(NSSet集合裏的元素不能重複),因此查找對應方法,只要找到對應的SEL
就能夠了。code
既然SEL是方法的惟一標識,那不一樣的類調用名字相同的方法怎麼辦呢?orm
每一個方法名有對應的惟一seletor,其
SEL
相同,但對應的IMP
函數指針不一樣。cdn
如何獲取SEL?對象
SEL s1 = @selector(test);
SEL s2 = NSSelectorFromString(@「test」)
複製代碼
以上兩個方法是等價的
typedef id (*IMP)(id, SEL, ...);
複製代碼
id
(消息接受者,也就是對象),SEL
(方法的名字),參數
XX調用XXX方法,參數XX也都肯定了
執行對應的方法:
[object test];
// @selector(test) 是一個C的字符串
[object performSelector:@selector(test)]];
// 轉換成以下實現方式
objc_msgSend(object,@selector(test))
複製代碼