CTMediator 原理詳解(一)

最近開始用CTMetidor來作App模塊化,順便研究一下它的實現原理bash

CTMetidor 源碼中常常出現以下關鍵詞:NSSelectorFromStringNSClassFromStringSEL 這些是個啥???模塊化

在理解CTMediator原理以前咱們先弄懂這麼幾個概念:函數

Method

先來看一下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; // 方法的具體實現
}
複製代碼

咱們能夠看到該結構體中包含一個SELIMP,實際上至關於在SELIMP之間做了一個映射,將SELIMP進行了關聯,經過SEL咱們即可以找到對應的IMP,從而調用方法的實現代碼。spa

SEL(selector)

  • 方法編號,對方法名hash化的字符串指針

  • 不管什麼類裏,只要方法名相同,SEL就相同。項目裏的全部SEL都保存在一個NSSet集合裏(NSSet集合裏的元素不能重複),因此查找對應方法,只要找到對應的SEL就能夠了。code

既然SEL是方法的惟一標識,那不一樣的類調用名字相同的方法怎麼辦呢?orm

每一個方法名有對應的惟一seletor,其SEL相同,但對應的IMP函數指針不一樣。cdn

如何獲取SEL?對象

SEL s1  = @selector(test);
SEL s2 = NSSelectorFromString(@「test」)
複製代碼

以上兩個方法是等價的

IMP (implement)

  • 一個函數指針,保存了方法的地址,內部實現:
typedef id (*IMP)(id, SEL, ...); 
複製代碼
  • 包含id(消息接受者,也就是對象),SEL(方法的名字),參數

XX調用XXX方法,參數XX也都肯定了

執行對應的方法:

[object test];
// @selector(test) 是一個C的字符串
[object performSelector:@selector(test)]];
// 轉換成以下實現方式
objc_msgSend(object,@selector(test))
複製代碼

總結

  • NSClassFromString 經過字符串的名稱來獲取一個類,能夠根據Target來進行獲取
  • NSSelectorFromString 經過字符串(已存在的方法名稱)獲取一個SEL
相關文章
相關標籤/搜索