美文网首页
JSPatch学习

JSPatch学习

作者: 熊妹妹 | 来源:发表于2016-10-13 17:43 被阅读23次

最近在做动态化方案看了很多相关的项目,rn、weex、luaview、lua+wax、jspatch等等,打算把其中核心的方案记录下来。

JSPatch的原理有很详细的讲解。跟lua+wax的核心原理基本一致,都是利用oc的运行时动态消息机制,但js不支持消息转发,作者很巧妙的替换了所有方法名让所有调用都走到同一个方法来处理再交给oc进行消息处理。

js脚本修改

如上面所说,js无法直接调用oc方法,会因为找不到方法而报错,于是对js脚本进行修改让其不报错又能运行。对js内所有的方法进行正则匹配,把方法名替换为__c,原方法名变为字符串类型的参数。通过__c()方法实现对oc的调用。

js对oc方法调用,即__c()的实现

  1. 获取参数,也就是原js的方法名,如果当前js对象有这个字段就直接执行。
  2. 取得类或对象和方法名,返回一个匿名函数。
  3. js在__c("methodName")没有修改,所以会紧跟对oc方法调用的参数。这个匿名函数调用时可以直接取到所有参数。
  4. 有了方法和参数,再对方法名作进一步修改,因为在js里调用oc方法时的方法名用下划线"_"拼接。
  5. 调用oc方法,在初始化js上下文JSContext时通过注入oc方法来实现。

oc方法调用

__c()方法执行完,就转到oc动态地进行方法调用。

  1. 把js对象转为oc对象,得到实例对象或类名、方法名、参数 。
  2. 获取方法参数的封装NSMethodSignature类型对象。其中对64位7.1以下系统的double和float类型参数修改为结构体类型。
  3. 根据方法签名创建NSInvocation类型对象。NSInvocation是调用函数的另一种方式,它将调用者,函数名,参数封装到一个对象,然后通过一个invoke函数来执行被调用的函数,其思想就是命令者模式,将请求封装成对象。
  4. JSPatch就是用NSInvocaiton来实现oc方法动态调用的。设置target、selector、参数后执行。在设置参数前对参数进行转换,因为js和oc之间传递对象,所以对一些int等类型要进行intValue取值操作。
  5. 读取返回值,对一些非对象的类型转成对象,比如int类型。把oc对象进行一层封装,作为返回值返回。

相关文章

  • JSPatch 浅探

    前言 JSPatch下载地址自己实现JSPatch的功能 修改JSPatch JSPatch简介 JSPatch ...

  • JSPatch学习

    最近在做动态化方案看了很多相关的项目,rn、weex、luaview、lua+wax、jspatch等等,打算把其...

  • App热更新技术——JSPatch学习分享

    如果不清楚本文的主角 JSPatch是什么请看我博客中的JSPatch学习笔记: 这里 和 这里 背景 iOS D...

  • JSPatch使用 私有变量操作

    基本使用 ** JSPatch 官方平台 ** ** JSPatch 语法转换 ** JSPatch基本使用 JS...

  • JSPatch 学习一

    JSPatch这个三方库相信很多IT人都知晓了,我因项目需要现在开始真正深入学习,有不对和出入的地方希望大家指正。...

  • JSPatch学习笔记

    简单记录一下学习心得,比较乱,后年完善JSPatch 学习笔记 1.文件加载首先,将要替换的JS文本进行正则替换,...

  • JSPatch

    JSPatch http://jspatch.com/Index/reg

  • 如何使用libffi库实现OC方法替换和调用 OC 函数

    最近在学习JS语言,走大前端的路子,学了两天后,感觉要小试牛刀。突然想到JSPatch中JSPatch.js是JS...

  • JSPatch 基础用法

    原文: JSPatch 基础用法 JSPatch Platform 索引 Request 调用 OC 方法2.1 ...

  • 关于JSPatch的学习

    最近JSPatch挺火的,于是抽时间学习一下留着备用在网上查询了不少关于JSPatch的文章,总结下来有两种不同的...

网友评论

      本文标题:JSPatch学习

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