在Objective-C中,方法的调用理解为对象接受消息。
运行时调用的方法告诉对象要干什么,给对象传递一个消息。发送消息后,编译器将其转换为对应的一条C语言消息发送原语
void objc_msgSend( id self , SEL cmd , ... )
第一个参数代表消息的接收者,第二个参数代表消息选择子。
objc_msgSend通过接收者的isa指针在接收者类对象的方法列表中找,名称为选择子的方法。找到则执行,否则就到父类中查找,都找不到说明接收者无法响应改消息,触发消息转发机制。
消息转发机制有三道防线,任何一道起作用都可以传递消息。按照先后顺序依次为:
1、动态补加方法
+ (BOOL)resolveInstanceMethod:(SEL)sel
+ (BOOL)resolveClassMethod:(SEL)sel
2、直接返回消息给另一个对象处理
- (id)forwardingTargetForSelector:(SEL)aSelector
3、手动生成签名方法并抓发给另一个对象
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation