OC中的所有方法调用,最终都是转换成runtime中的一个C语言消息分发函数:
objc_msgSend(消息接收者,方法名 ,参数。。。)
这条消息发送之后,系统会在receiver的类对象的方法列表中找这个方法,如果没找到,再到receiver的父类的方法列表中找,如此直到根类至找到为止,如果还没有找到会报出错误。
(缓存:方法第一次被调用之后,方法会被存入一张缓存表,之后如果再被调用时就直接从缓存表中取出,以提高效率)。
Runtime中对调用过程做了缓存,在抛出错误之前会进行动态决议和消息转发过程。
若对象无法响应某个选择子,则进入消息转发流程:
1、动态方法解析:+(bool) resolveInstanceMethod:(SEL)selector
+(bool) resolvelassMethod:(SEL)selector
2、备用接受者:
(id)forwardingargetForSelector(SEL)slector (把这条消息转发给其他对象处理)
获取方法签名进行消息转发
- (NSMethodSignature*)methodSignatureForSelector:
完整的消息转发
- (void)forwardingInvocation(NSInvocation*)invocateion
1、通过运行期的动态方法解析功能,我们可以在需要某个方法是在将其加入类中
2、对象可以把其无法解读的某些消息转交给其他对象来处理
3、经过上述两步后,如果还是没有办法处理消息,那就启动完整的消息转发机制
参考链接https://blog.csdn.net/flover5724059/article/details/88926573
网友评论