JSPatch观后感

覆盖函数

1一开始把js调用代码a.test()从变成a.__c(“test”)()统一函数入口

2 使用context获取调用defineclass时候的参数拆解成类名,函数名,js代码,把js执行代码放入dic[类名][函数名],并把函数IMP指向_objc_msgForward让函数进入方法转发流程并把ForwardInvocation的IMP指向JPForwardInvocation(以便获取原来的函数参数类型)

3 当函数执行的时候进入方法转发,进入JPForwardInvocation。通过方法签名获取原来函数名然后通过dic[类名][函数名]获取到对应的js代码。

4 执行代码。

执行代码

1 在一开始加载代码时js代码的时候如a.alloc.init会正则替换成A.__c(“alloc”)().__c(“init”)()。

2 执行A.__c(“alloc”)()时候在js的__c方法里面获取函数名alloc以及其参数,并传给_methodFunc函数最终调用_OC_callC(类方法)。

3 context截取_OC_callC方法并根据类名和函数名参数运行并返回一个实例变量地址address。

4 把实例变量地址__obj以及类名通过context传回给js,现在js代码相当于__obj.__c(“init”)()。

5 再次在__c方法里面获取函数名alloc以及其参数,并传给_methodFunc函数最终调用_OC_callI(实例方法)。

6context截取_OC_callI方法并根据实例名和函数名参数运行。

(注:里面判断是否实例变量是通过判断__obj是否存在。)

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

推荐阅读更多精彩内容

  • 转载:原文链接 http://blog.cnbang.net/tech/2808/ JSPatch以小巧的体积做到...
    made_China阅读 401评论 0 0
  • http://blog.cnbang.net/tech/2808/ JSPatch实现原理详解 注:本文较早撰写,...
    hypercode阅读 1,252评论 0 1
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 5,067评论 0 13
  • 今天晒晒老妈,老妈的脾气性格已经接近老顽童了,让人欢喜让人忧,不高兴的时候根本不会考虑别人的感受,说话...
    艳青阅读 414评论 3 2
  • 美好的一天从感恩开始!我感恩生命的富足美好!让我可以自在的生活。我感恩健康!让我可以无忧的生活。我感恩天气!昨天接...
    淘淘的简书阅读 91评论 0 0