CTMediator 原理詳解(二)

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

在介紹 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;spa

判斷對象是否響應此方法,通常和performSelector 一塊兒使用,防止crash指針

performSelector

CTMetidor 主要用到就是RunTime中的讓對象發送消息code

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

RunTime

一、經過obj的isa指針找到它的 class ;
二、在 class 的 method list 找 eat ;
三、若是 class 中沒到 eat,繼續往它的 superclass 中找 ;
四、一旦找到 eat 這個函數,就去執行它的實現IMP 。

來看一下 CTMetidor 的一段代碼:cdn

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

actionSEL) 咱們經過 NSSelectorFromString 獲取了,target 咱們經過 NSClassFromString 獲取,接下來只須要經過 performSelector方法 執行 targetClass) 中的 action 便可。對象

相關文章
相關標籤/搜索