在上一篇文章中我們大概知道了
CTMetidor
中的NSSelectorFromString
、NSClassFromString
、SEL
這篇文章主要介紹一下respondsToSelector
、performSelector
、NSInvocation
、NSMethodSignature
,瞭解完這些之後對理解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 來進行實現,其內部實現步驟:
1、通過obj的isa指標找到它的 class ;
2、在 class 的 method list 找 eat ;
3、如果 class 中沒到 eat,繼續往它的 superclass 中找 ;
4、一旦找到 eat 這個函式,就去執行它的實現IMP 。
來看一下 CTMetidor
的一段程式碼:
[target performSelector:action withObject:params];
複製程式碼
action
(SEL
) 我們通過 NSSelectorFromString
獲取了,target
我們通過 NSClassFromString
獲取,接下來只需要通過 performSelector
方法 執行 target
(Class
) 中的 action
即可。