Objective-C中调用方法的过程
2021-03-08 本文已影响0人
唯忆青语
(1)消息传递流程
(a)程序在运行时,runtime库会根据对象的isa指针找到对象所属的类,然后在类的缓存中寻找同名方法实现IMP,如果没找到就去类的方法列表中寻找可执行方法。
(b)若本类没有就去本类的父类中寻找,父类找不到再向父类的父类寻找,直至根元类。
(c)期间找到了方法的函数实现,就调用函数指针到对应的函数进行执行,如果此时仍然未找到,就会进入消息转发流程。
(2)消息转发流程
(a)动态方法解析 Method resolution:询问接收者所属的类,能不能动态添加方法。能动态添加则去调用方法,不能动态添加进入下一步
(b)快速转发Fast forwarding:询问接收者 有没有其他对象可以处理这个方法,有则将方法转发给这个类,没有则进入下一步。如果没有接收者没有其他备援对象,则也会进入下一步。
(c)完整消息转发Normal forwarding:首先去获取函数签名,获取到了函数签名后会封装一个NSInvocation对象并发送forwardInvocation消息给目标对象。 无法获取到签名则会发出doesNotRecognizeSelector消息,然后crash。