JSPatch 技术要点

作者:干掉crash
链接:https://zhuanlan.zhihu.com/p/21884786
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果有方法不遵守语言规则呢?实际上在 JS 界,有个很常用的伎俩,就是预编译:

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

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

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

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

这样做简洁高效地解决了前面的问题,不需要去 OC 遍历每个类的方法,不需要存储这些方法,就可以调用任意 OC 方法,只需要给 JS 基类定义一个 __c 方法就可以了。正则替换后无论调用 OC 的什么方法,都不会有语法错误,因为都变成调用这个 __c 方法,在这个 __c 方法里做处理去 OC 层调用相应的方法就行了。

时间: 2024-10-07 06:47:07

JSPatch 技术要点的相关文章

android开发步步为营之24:milliondollars游戏技术要点代码生成控件和读取xml文件

Milliondollars智力问答游戏,主要的技术要点(一).读取题库数据xml文件(二).如何动态的生成题目和选项.这里做个总结,供以后参考. (一).读取题库数据xml文件 将assets/topics.xml文件读取 topics.xml格式: <?xml version="1.0" encoding="UTF-8"?> <book> <question topic="<全唐诗>是哪个时期的人编辑的?&qu

HTML5技术要点

HTML5技术要点 1.HTML5视频 <!DOCTYPE HTML> <html> <body> <video src="/i/movie.ogg" width="320" height="240" controls="controls"> Your browser does not support the video tag. </video> </body

ThinkSNS开源社交系统基础技术要点

ThinkSNS采PHP+MySQL技术平台,社交核心+多应用+多插件机制. 下面我们将为大家介绍开源社交系统ThinkSNS基础的技术要点: 开源社交系统ThinkSNS中,应用都有一个配置文件,目前应用目录是apps/<app name> 所以,配置文件就是:"apps/<app name>/manage.json",下面有演示代码:    我们可以看到这是比较新的应用配置,老的应用中只需要配置"resource"项即可,配置这项后,静态

C/S通信模型和相关技术要点

几乎所有的项目中,都会涉及到客户端和服务端.而客户端与服务器之间的通信又是一个很常见但又有需要问题的技术问题. 首先,连接方式有长连接和短连接.先看看概念. 长连接短连接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西: 长连接:系统通讯连接建立后就一直保持. 短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应后连接关闭: 通讯实体间使用长连接,一般还需要定义心跳消息,定期发送来检测系统间链路是否异常,每隔一定时间发送一次心跳,如果一定次数没有收到心跳消息,这认为此

Unity3d集成移动MM SDK 2.2的技术要点(坑爹的MM SDK)

原地址:http://dong2008hong.blog.163.com/blog/static/4696882720140423517951/ U3D集成移动MM的SDK绝对是以坑爹为主的东西. 浪费大量时间去弄这玩意.真不知道设计MM SDK的人咋想的,你们应该去参考下移动百宝箱的SDK设计方式,简单易用不坑爹,1小时内绝对能搞定. 因为移动MM支付的SDK只提供android版本的,要自己写过一个android项目再打包重新生成一个jar来供Unity3d引擎使用,这一部分我就不写了,网上

webkit webApp 开发技术要点总结

webkit webApp 开发技术要点总结 如果你是一名前端er,又想在移动设备上开发出自己的应用,那怎么实现呢?幸好,webkit内核的浏览器能帮助我们完成这一切.接触 webkit webApp的开发已经有一段时间了,现把一些技巧分享给大家 : 1. viewport: 也就是可视区域.对于桌面浏览器,我们都很清楚viewport是什么,就是出去了所有工具栏.状态栏.滚动条等等之后用于看网页的区域, 这是真正有效的区域.由于移动设备屏幕宽度不同于传统web,因此我们需要改变viewport

R语言统计分析技术研究 特征值选择技术要点

特征值选择技术要点                          作者:王立敏 文章来源:  网络 1.特征值 特征值是线性代数中的一个重要概念.在数学,物理学,化学,计算机等领域有着广泛的应用.设A是n阶方阵,如果存在数m和非零n维列向量x,使得Ax=mx成立,则称m是A的一个特征值或本征值.非零n维列向量x称为矩阵A的属于特征值m的特征向量或本征向量,简称A的特征向量或A的本征向量. 2.使用R语言的Boruta包进行特征选择 在数据分析过程中,利用各种图表进行数据探索是必要的前期工作

《环信支持千万并发即使通讯的技术要点》阅读摘要

一天早上起来,偶然机会看到<环信支持千万并发即使通讯的技术要点>演示文档,简单翻阅之后,感觉干货很多,于是快速记下以下笔记. 一.IM协议和IM Server XMPP确实很传统,WhatsApp选用了,同时经过压缩.精简(比如说user字符串使用u字符替代)处理,让XMPP轻量不少. MQTT,如何实现群组.好友呢,这个是业务层面上事情,大家都订阅某一个主题Topic好了,属于业务拓展. SIP,接触少. 微信私有协议ActivitySync,以前在博客上分享过. 正确拼写是WhatsApp

【转】vue项目重构技术要点和总结

vue数据更新, 视图未更新 这个问题我们经常会遇到,一般是vue数据赋值的时候,vue数据变化了,但是视图没有更新.这个不算是项目重构的技术要点,也和大家分享一下vue2.0通常的解决方案吧! 解决方案如下: 1.通过vue.set方式赋值 Vue.set(数据源, key, newValue) 2. 通过Array.prototype.splice方法 数据源.splice(indexOfItem,1, newValue) 3.修改数据的长度 数据源.splice(newLength) 4.