MST

星途 面试题库

面试题:Objective-C中Runtime如何实现方法的动态解析?

请简述Objective-C运行时在对象接收到无法识别的消息时,进行方法动态解析的具体流程,包括涉及到的类方法和实例方法的动态解析机制。
19.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

方法动态解析流程

  1. 动态方法解析:当对象接收到无法识别的消息时,首先进入动态方法解析阶段。
    • 实例方法:运行时会调用类的+ (BOOL)resolveInstanceMethod:(SEL)sel类方法。如果实现了该方法,并在其中通过class_addMethod函数动态添加了对应SEL的实例方法,那么消息发送就会成功,程序继续执行新添加的方法。
    • 类方法:运行时会调用类的+ (BOOL)resolveClassMethod:(SEL)sel类方法。若实现此方法,并在其中动态添加对应SEL的类方法,消息发送成功,程序执行新添加的类方法。
  2. 备用接收者:如果动态方法解析没有处理该消息,接下来进入备用接收者阶段。运行时会调用- (id)forwardingTargetForSelector:(SEL)aSelector实例方法。如果实现了该方法,并返回一个能处理该SEL的对象,那么消息会转发给这个备用对象处理。
  3. 完整的消息转发:若备用接收者阶段也未处理消息,进入完整的消息转发阶段。
    • 首先,运行时会创建一个NSInvocation对象,封装消息的参数和返回值等信息,然后调用- (void)forwardInvocation:(NSInvocation *)anInvocation实例方法。在该方法中,可以手动指定将消息转发给其他对象处理。
    • 如果forwardInvocation:方法未实现或未正确处理消息,最后会调用- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector实例方法来获取方法签名。若获取到有效的方法签名,forwardInvocation:方法会再次被调用进行消息转发;若未获取到有效签名,程序会抛出NSInvalidArgumentException异常,提示无法识别的选择器。