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中的代码, 运行这些代码.
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,838评论 0 9
  • JSPatch是一个可以在线修复bug的轻量级框架,项目中嵌入这个框架可以让你的app具有热更新的能力。你可以通过...
    daixunry阅读 6,105评论 5 38
  • 消息发送和转发流程可以概括为:消息发送(Messaging)是 Runtime 通过 selector 快速查找 ...
    lylaut阅读 1,910评论 2 3
  • 听—— 1.过年了,和父母长辈、街坊邻居说说话,听他们说说你小时候的样子、他们小时候是怎样过年的,把你听到的有趣的...
    袁卫星阅读 8,187评论 10 17
  • 日子一天一天过去了 生活卑微而顼碎 在一粒尘埃之中 我看见我自己 我小小的身躯很小 在人海中 我静静的来 悄悄...
    魏芒阅读 607评论 1 7