jspatch原理简析

  1. startEngine函数中, 给jscontext定义了一个方法
context[@"_OC_defineClass"] = ^(NSString *classDeclaration, JSValue *instanceMethods, JSValue *classMethods) {
        return defineClass(classDeclaration, instanceMethods, classMethods);
    };
  1. 这个定义会在jspatch.js里面被运行
  2. 这个方法里面运行了defineClass
  3. 这个defineClass里面把所有demo.js里面的需要重载的方法都遍历一次
  4. 每次遍历的时候, 吧原来的方法给加到新的imp上(前缀ORIG)
  5. 然后再把原来的selector给换了, 换成_objc_msgForward, 这个_objc_msgForward函数的作用是: 当对象没有实现某个方法 ,会调用这个函数进行方法转发。 因此这些方法找不到了, 就全都转发给forwardInvocation了.
  6. 然后再hookforwardInvocation方法, 吧这个方法换成静态JPForwardInvocation方法,
  7. 在JPForwardInvocation中, 把根据selector的名字找到之前js中的代码, 运行这些代码.

你可能感兴趣的:(jspatch原理简析)