面试题答案
一键面试- 动态方法解析:
- 首先,运行时系统会调用
+ (BOOL)resolveInstanceMethod:(SEL)sel
(针对实例方法)或+ (BOOL)resolveClassMethod:(SEL)sel
(针对类方法)。 - 在这个方法中,类可以动态添加方法实现。如果成功添加,消息转发就会正常进行,找到新添加的方法实现并执行。
- 首先,运行时系统会调用
- 备用接收者:
- 如果动态方法解析没有处理该消息,运行时会调用
- (id)forwardingTargetForSelector:(SEL)aSelector
。 - 这个方法允许对象返回另一个对象来处理这个消息。如果返回了一个非
nil
对象,那么这个对象就会成为新的消息接收者来处理该消息。
- 如果动态方法解析没有处理该消息,运行时会调用
- 完整转发:
- 如果备用接收者也没有处理该消息,运行时会进入完整转发阶段。
- 首先调用
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
,这个方法需要返回一个NSMethodSignature
对象,描述该消息的方法签名。如果返回nil
,则会调用- (void)doesNotRecognizeSelector:(SEL)aSelector
抛出异常。 - 若成功返回
NSMethodSignature
,则接着调用- (void)forwardInvocation:(NSInvocation *)anInvocation
,在这个方法中,可以将消息转发给其他对象处理,通过修改NSInvocation
对象来指定新的目标对象并执行消息。