OCMethodTrace原理
增加一个全新方法,名为_OMTMessageTemp开头, 然后将原有方法进行hook
整体流程就是
1、 给类,增加1个新的方法, 例如__OMTMessageFinal_Animal->setName:age:, 并且绑定到旧方法的函数地址;
把旧方法绑定到一个并不存在的方法method实现上, __OMTMessageTemp_Animal->setName:age: 使其去转发;
2、 类通过NSObject分类定义的消息转发,本类找不到方法( __OMTMessageTemp_Animal->setName:age:)会走对象转发,转发给messageStub 1次转发
3、 messageStub仍然找不到方法, 转发给NSInvocation 1次转发,最终入口仍然在OCMethodTrace类, 将找不到的方法名字 __OMTMessageTemp_Animal->setName:age:) 改为 __OMTMessageFinal_Animal->setName:age:, 而final_class方法在第一部中已经被绑定到原方法对应到的函数地址上. 调用他, 就是回调原方法.
消息转发
本类及父类中都找不到的方法,就会进入以下流程:
消息转发
1、resolveXXX
2、forwardingTargetForSelector
3、methodSignatureForSelector、forwardInvocation
4、doesNotRecognizeSelector
网友评论