2019-02-19 OCMethodTrace原理

增加一个全新方法,名为_OMTMessageTemp开头, 然后将原有方法进行hook
整体流程就是

1、 给类,hook 旧方法, 增加1个新的方法, 例如__OMTMessageFinal_Animal->setName:age:, 并且绑定到旧方法的函数地址;
把旧方法绑定到一个并不存在的方法method实现上, __OMTMessageTemp_Animal->setName:age: 使其去转发;

2、 进入NSObject分类,hook forwardingTargetForSelector, 本类找不到方法( __OMTMessageTemp_Animal->setName:age:)会走对象转发,转发给messageStub 1次转发

3、 进入OMTMessageStub类,实现methodSignatureForSelector、forwardInvocation, messageStub仍然找不到方法, methodSignatureForSelector将找不到的方法名字 __OMTMessageTemp_Animal->setName:age:) 改为 __OMTMessageFinal_Animal->setName:age:, 而final_class方法在第一部中已经被绑定到原方法对应到的函数地址上. 调用他, 就是回调原方法,forwardInvocation中将NSInvocation对象作为参数传递给OCMethodTrace类单利类入口, 在入口实现逻辑

消息转发
本类及父类中都找不到的方法,就会进入以下流程:
消息转发
1、resolveXXX
2、forwardingTargetForSelector
3、methodSignatureForSelector、forwardInvocation
4、doesNotRecognizeSelector

你可能感兴趣的:(2019-02-19 OCMethodTrace原理)