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