在Objective-C中,方法的調(diào)用理解為對(duì)象接受消息。
運(yùn)行時(shí)調(diào)用的方法告訴對(duì)象要干什么,給對(duì)象傳遞一個(gè)消息。發(fā)送消息后,編譯器將其轉(zhuǎn)換為對(duì)應(yīng)的一條C語言消息發(fā)送原語
void objc_msgSend( id self , SEL cmd , ... )
第一個(gè)參數(shù)代表消息的接收者,第二個(gè)參數(shù)代表消息選擇子。
objc_msgSend通過接收者的isa指針在接收者類對(duì)象的方法列表中找,名稱為選擇子的方法。找到則執(zhí)行,否則就到父類中查找,都找不到說明接收者無法響應(yīng)改消息,觸發(fā)消息轉(zhuǎn)發(fā)機(jī)制。
消息轉(zhuǎn)發(fā)機(jī)制有三道防線,任何一道起作用都可以傳遞消息。按照先后順序依次為:
1、動(dòng)態(tài)補(bǔ)加方法
+ (BOOL)resolveInstanceMethod:(SEL)sel
+ (BOOL)resolveClassMethod:(SEL)sel
2、直接返回消息給另一個(gè)對(duì)象處理
- (id)forwardingTargetForSelector:(SEL)aSelector
3、手動(dòng)生成簽名方法并抓發(fā)給另一個(gè)對(duì)象
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation