OC的消息机制,会经常在面试中被问到,所以这里记录一下,
消息发送
首先会判断receiver 是否为nil,假如为nil,那么就什么也不做,假如不为nil,那么就会去receiverClass的方法缓存里面查找方法,假如找到了就会调用方法,假如找不到,就会去receiverClass的方法列表中查找方法,假如也找不到,就去superClass的方法缓存中查找,也没找到,就会去superClass的方法列表里面找,直到一直找到了基类也没有找到,那么它就会开始动态方法解析,假如中间哪一步找到了方法,那么就会调用方法,结束查找,并把方法缓存到receiverClass的方法缓存中去
动态解析
首先会判断是否动态解析过,假如已经动态解析过了,那么就会进入消息转发阶段,假如没有,那么就会调用+resolveInstanceMethod:或者 +resolveClassMethod:方法,开发者可以实现这两个方法来达到动态添加方法实现的目的,调用完方法之后,会标记为已经动态解析过了,并会重新走“消息发送”流程,从receiverClass的缓存中查找方法这一步开始执行。
消息转发
首先会调用forwardingTargetForSelector:方法,假如不为nil, 那么就会拿到返回值,调用objc_msgSend(返回值,SEL),假如返回值为nil,那么就会调用methodSignatureForSelector:,假如methodSignatureForSelector:返回值不为nil,就会调用forwardInvocation:方法,开发者可以在这个方法中自定义任何逻辑,假如返回值为nil,那就会调用doesNotRecognizeSelector:方法,
forwardingTargetForSelector:与methodSignatureForSelector:有对象方法和类方法两个版本,可根据开发需要,自行选择。