CTMediator 原理詳解(二)

LuckyRoc發表於2019-01-07

在上一篇文章中我們大概知道了 CTMetidor 中的 NSSelectorFromStringNSClassFromStringSEL 這篇文章主要介紹一下 respondsToSelectorperformSelectorNSInvocationNSMethodSignature ,瞭解完這些之後對理解 CTMediator 很有幫助

在介紹 performSelector 之前,先簡單說一下RunTime吧

RunTime

什麼是 RunTime ?

  • RunTime簡稱執行時。OC就是執行時機制,也就是在執行時候的一些機制,其中最主要的是訊息機制, 訊息(方法)傳遞,如果訊息(方法)在物件中找不到,就進行轉發

RunTime 可以用來做什麼 ?

  • 通過RunTime我們可以 讓一個物件傳送訊息(也就是執行方法)、交換方法(Method Swizzling)、動態新增方法、給分類增加屬性、字典轉模型等
// 建立person物件
Person *p = [[Person alloc] init];
// 呼叫物件方法
[p eat];
// 本質:讓物件傳送訊息
objc_msgSend(p, @selector(eat));
    
// 呼叫類方法的方式:兩種
// 第一種通過類名呼叫
[Person eat];
    
// 第二種通過類物件呼叫
[[Person class] eat];
// 用類名呼叫類方法,底層會自動把類名轉換成類物件呼叫
// 本質:讓類物件傳送訊息
objc_msgSend([Person class], @selector(eat));
複製程式碼

respondsToSelector

(BOOL)respondsToSelector:(SEL)aSelector;

判斷物件是否響應此方法,一般和performSelector 一起使用,防止crash

performSelector

CTMetidor 主要用到就是RunTime中的讓物件傳送訊息

performSelector 本質上就是會轉化成 objc_msgSend 來進行實現,其內部實現步驟:

RunTime

1、通過obj的isa指標找到它的 class ;
2、在 class 的 method list 找 eat ;
3、如果 class 中沒到 eat,繼續往它的 superclass 中找 ;
4、一旦找到 eat 這個函式,就去執行它的實現IMP 。

來看一下 CTMetidor 的一段程式碼:

[target performSelector:action withObject:params];
複製程式碼

actionSEL) 我們通過 NSSelectorFromString 獲取了,target 我們通過 NSClassFromString 獲取,接下來只需要通過 performSelector方法 執行 targetClass) 中的 action 即可。

相關文章