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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,806评论 0 9
  • 版权归作者所有,任何形式转载请联系作者。 作者:天蝎心尘之路(来自豆瓣) 来源:https://www.douba...
    天蝎心尘之路阅读 4,035评论 2 2
  • 我一直独自行走 慢慢忘了来路和初衷 路标渐渐模糊 人群淹没了我的身形 风景留给了背影 擦肩而过的面孔没有一丝笑容 ...
    老辉阅读 2,981评论 3 2
  • 很久之前 就梦过 如果有一天 有一间房 有一扇窗 很高很高 坐看万家灯火 …… 那该多好 梦不会久远 终会 属于我 ……
    大梨不吃梨阅读 1,040评论 2 0
  • 对象在清理厨房时意外的看到一只鲜活的小蜗牛,三岁的小女儿如获珍宝,把它养在了玩具箱上。家住五楼,处于闹市,那么这个...
    小寒轻阅读 3,081评论 0 0