面试题答案
一键面试动态方法解析
- 处理逻辑:
- 当对象接收到无法识别的消息时,首先进入动态方法解析阶段。
- 运行时系统会调用
+ (BOOL)resolveInstanceMethod:(SEL)sel
方法来尝试动态添加实例方法。如果是类方法,则调用+ (BOOL)resolveClassMethod:(SEL)sel
。 - 在这些方法中,可以使用
class_addMethod
函数来动态添加方法实现。
- 作用:
- 提供了一种在运行时动态添加方法实现的机制。这样开发者可以在需要时,才为类添加特定方法的实现,而不必在编译期就确定所有方法的实现。例如,在一些插件化或运行时扩展功能的场景中很有用。
消息转发
- 备用接收者阶段:
- 处理逻辑:如果动态方法解析没有解决问题,运行时会进入消息转发的备用接收者阶段。它会调用
-(id)forwardingTargetForSelector:(SEL)aSelector
方法。在这个方法中,开发者可以返回一个能处理该消息的备用对象。 - 作用:允许将消息转发给其他对象处理,实现了对象之间协作处理消息的能力。比如在代理模式的实现中,可以通过这种方式将消息转发给代理对象。
- 处理逻辑:如果动态方法解析没有解决问题,运行时会进入消息转发的备用接收者阶段。它会调用
- 完整消息转发阶段:
- 处理逻辑:若备用接收者阶段也没有解决问题,就进入完整消息转发阶段。首先,运行时会调用
-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
方法,开发者需要返回一个合适的方法签名NSMethodSignature
。如果返回nil
,则会调用doesNotRecognizeSelector:
抛出异常。若返回了有效的方法签名,接着会调用-(void)forwardInvocation:(NSInvocation *)anInvocation
方法,在这个方法中,可以手动指定消息的最终接收者,并通过NSInvocation
对象来传递消息和参数进行调用。 - 作用:提供了一种更加灵活和通用的消息处理机制。通过完整消息转发,开发者可以模拟正常的方法调用流程,对消息进行更复杂的处理和转发,实现一些特殊的功能,比如方法的拦截、统计方法调用次数等。
- 处理逻辑:若备用接收者阶段也没有解决问题,就进入完整消息转发阶段。首先,运行时会调用