iOS運(yùn)行時(shí)消息的傳遞與轉(zhuǎn)發(fā)

1.消息的傳遞

objc_msgSend()函數(shù)會(huì)一句接受者(調(diào)用方法的對(duì)象)的類型和選擇子(方法名)來調(diào)用適當(dāng)?shù)姆椒ā?/p>

在class中會(huì)先去cache中 通過SEL查找對(duì)應(yīng)函數(shù)method(cache中method列表是以SEL為key通過hash表來存儲(chǔ)的,這樣能提高函數(shù)查找速度),若 cache中未找到。再去class中的消息列表methodList中查找,若methodlist中未找到,則取superClass中查找。若能找到,則將method加 入到cache中,以方便下次查找,并通過method中的函數(shù)指針跳轉(zhuǎn)到對(duì)應(yīng)的函數(shù)中去執(zhí)行,如果在類及其繼承體系中都沒有找到,那么就會(huì)進(jìn)入到消息的轉(zhuǎn)發(fā)。

2.消息的轉(zhuǎn)發(fā)

+?(BOOL)resolveClassMethod:(SEL)selector

修改方法

-?(id)forwardingTargetForSelector:(SEL)selector

修改方法的調(diào)用

-?(void)forwardInvocation:(NSInvocation?*)invocation

修改方法及其調(diào)用者

如果這3個(gè)都沒有處理,那么就會(huì)doesNotRecognizeSelector拋出異常

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容