- OC由于运行时特性,可以在运行期间动态添加方法,这个寻找动态添加的方法的过程就是动态消息转发。
- iOS的消息转发机制分为三个步骤:动态方法解析、快速消息转发机制、标准消息转发机制
1.动态方法解析
对象在无法解读消息会首先调用所属类的下列类方法:
+ (BOOL) resolveInstanceMethod:(SEL)selector
2.快速消息转发
寻找是否在其他对象内有该方法实现,并将该消息转发给这个对象
-(id)forwardingTargetForSelector:(SEL)selector
如果目标对象实现了该方法,Runtime这时就会调用这个方法,给你把这个消息转发给其他对象的机会.只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然返回的对象会变成return的对象,否则就会继续nurmal fowarding
3.标准消息转发(normal forwarding)
这一步是消息转发的最后一步,首先会发送
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
消息获得函数的参数和返回值,如果返回nil,runtime则会发出doesNotRecognizeSelector消息,然后crash,若是返回了一个函数签名,runtime就会创建一个NSInvocation对象并发送
- (void)forwardInvocation:(NSInvocation *)Invocation
消息给目标对象
总结:
- objc_msgSend在进行MethodTableLookup常规查找 imp 缓存
- 如果缓存没有找到imp,则进行慢速递归
- 慢速递归如果也没有找到,则意味着即将奔溃,即无imp
如上情况继续分析:
- 是否有特殊处理,如果有:对底层动态进行决议和解析
- 如果没有特殊处理,有没有交给别人处理
-
如果没有交给别人去处理,意味着这些方法你不想处理,但是任要实现
1.methodSignatureForSelector(),进行方法签名,把方法丢出去
2.forwardInvocation()来对消息处理