美文网首页
JSPatch观后感

JSPatch观后感

作者: 风车2017 | 来源:发表于2017-10-27 14:50 被阅读0次

    覆盖函数

    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是否存在。)

    相关文章

      网友评论

          本文标题:JSPatch观后感

          本文链接:https://www.haomeiwen.com/subject/ddorpxtx.html