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拋出異常