MST

星途 面试题库

面试题:Objective-C动态方法解析与消息转发

在Objective-C消息发送过程中,如果对象没有找到对应的方法实现,动态方法解析和消息转发是如何处理的?请详细说明这两个阶段各自的处理逻辑和作用。
47.5万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

动态方法解析

  1. 处理逻辑
    • 当对象接收到无法识别的消息时,首先进入动态方法解析阶段。
    • 运行时系统会调用 + (BOOL)resolveInstanceMethod:(SEL)sel 方法来尝试动态添加实例方法。如果是类方法,则调用 + (BOOL)resolveClassMethod:(SEL)sel
    • 在这些方法中,可以使用 class_addMethod 函数来动态添加方法实现。
  2. 作用
    • 提供了一种在运行时动态添加方法实现的机制。这样开发者可以在需要时,才为类添加特定方法的实现,而不必在编译期就确定所有方法的实现。例如,在一些插件化或运行时扩展功能的场景中很有用。

消息转发

  1. 备用接收者阶段
    • 处理逻辑:如果动态方法解析没有解决问题,运行时会进入消息转发的备用接收者阶段。它会调用 -(id)forwardingTargetForSelector:(SEL)aSelector 方法。在这个方法中,开发者可以返回一个能处理该消息的备用对象。
    • 作用:允许将消息转发给其他对象处理,实现了对象之间协作处理消息的能力。比如在代理模式的实现中,可以通过这种方式将消息转发给代理对象。
  2. 完整消息转发阶段
    • 处理逻辑:若备用接收者阶段也没有解决问题,就进入完整消息转发阶段。首先,运行时会调用 -(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 方法,开发者需要返回一个合适的方法签名 NSMethodSignature。如果返回 nil,则会调用 doesNotRecognizeSelector: 抛出异常。若返回了有效的方法签名,接着会调用 -(void)forwardInvocation:(NSInvocation *)anInvocation 方法,在这个方法中,可以手动指定消息的最终接收者,并通过 NSInvocation 对象来传递消息和参数进行调用。
    • 作用:提供了一种更加灵活和通用的消息处理机制。通过完整消息转发,开发者可以模拟正常的方法调用流程,对消息进行更复杂的处理和转发,实现一些特殊的功能,比如方法的拦截、统计方法调用次数等。