JSPatch 技术要点

做者:干掉crash
连接:https://zhuanlan.zhihu.com/p/21884786
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。

若是有方法不遵照语言规则呢?实际上在 JS 界,有个很经常使用的伎俩,就是预编译:vue


也就是咱们写的脚本不直接拿给 JS 引擎执行,而是进行一些转换后才执行,在现代框架这个用法很常见, react/vue 都用了,甚至还有像 coffieScript 这样把 JS 彻底换成另外一种语言的作法。react

想到这一点,刚才的问题就很好解决了。ruby

只须要把全部函数调用在执行前都替换一遍,变成去调用一个固定的 __c 函数, 这个 __c 函数模拟了 ruby/lua 等语言的元方法机制,对方法调用进行转发。框架

仍是以调用 UIView 的 alloc 方法为例,这个语句在执行以前会被替换为调 UIView 的 __c 方法,把 “alloc” 做为字符串参数穿进去,在 __c 方法里判断调用者 UIView 是否是 OC 对象。若是是,就把类名和传进来的方法名传到 OC 层进行调用,若是不是,就调用回 JS 这个对象的方法。函数

这样作简洁高效地解决了前面的问题,不须要去 OC 遍历每一个类的方法,不须要存储这些方法,就能够调用任意 OC 方法,只须要给 JS 基类定义一个 __c 方法就能够了。正则替换后不管调用 OC 的什么方法,都不会有语法错误,由于都变成调用这个 __c 方法,在这个 __c 方法里作处理去 OC 层调用相应的方法就好了。lua

相关文章
相关标签/搜索