JSPatch VS Wax
Posted 58无线技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSPatch VS Wax相关的知识,希望对你有一定的参考价值。
JSPatch |
Wax |
||
iOS版本支持 |
7.0 + |
无限制 |
|
占用空间 | 基本功能 80K |
基本功能 1.5M |
|
全功能 220K |
全功能 3M |
||
安装 |
引入 .h .m文件 |
引入 .h .m文件 / POD |
|
使用 |
启动服务,执行脚本 |
启动服务,执行脚本 |
|
脚本执行 原理 |
通过javascriptCore解析,把要调用的对象和方法名传递给OC |
通过Wax解析,把要调用的对象和方法名传递给OC |
|
方法替换/增加 原理 |
通过runtime,用重写的ForwardInvocation替换脚本修改/增加的方法 |
||
基本语法 |
|||
类 声明 实例方法声明 类方法声明 |
defineClass(“MyTableViewController”:UITableViewController<UITableViewDelegate,UITableViewDataSource>, { tableView_didSelectRowAtIndexPath: function(tableView, indexPath) { ... }, },{ shareInstance: function() { ... }, }) |
waxClass{"MyTableViewController", UITableViewController,protocols = {“UITableViewDelegate”,”UITableViewDataSource”}} function tableView_didSelectRowAtIndexPath(self,tableView,indexPath) … end 优先 替换 类方法 , 如果没有对应的类方法,则替换/增加 类方法 和 实例方法。 |
|
引入头文件 |
Require('UIView, UIColor') |
无需 |
|
调用类方法 |
var redColor = UIColor.redColor(); |
local redColor = UIColor:redColor( |
|
调用实例方法 |
view.setNeedsLayout(); |
view:setNeedsLayout() |
|
SETTER |
view.setBackgroundColor(redColor); |
view:setBackgroundColor(redColor) |
|
GETTER |
var color = view.backgroundColor(); |
local color = view:backgroundColor() |
|
增加属性 |
self.setProp_forKey("JSPatch", “data”); var data = self.getProp(“data”); |
self.data = “Wax” local data = self.data |
|
私有成员变量 @implementation MyTableViewController { NSArray *_data; } |
var data = self.valueForKey("_data") self.setValue_forKey(["JSPatch"], "_data") |
local data = self:getIvarObject(“_data”) self:setIvar_withObject({“Wax”},”_data”) |
|
方法名转换 |
var indexPath = require('NSIndexPath').indexPathForRow_inSection(0, 1); |
local indexPath = NSIndexPath:indexPathForRow_inSection(0, 1) |
|
[self _method]; (自带下划线) |
self.__method(); |
self:UNDERxLINEmethod() |
|
Struct |
{x:20, y:20, width:100, height:100} |
CGRect(1, 2, 3, 4) |
|
@selector (indexPathForRow:inSection:) |
“indexPathForRow_inSection:” |
“indexPathForRow:inSection:” |
|
nil |
null / undefined |
nil / null |
|
NSNull |
nuns' |
NSNull:null() |
|
NSArray/NSString/ NSDictionary |
不会转换为JS类型,可用.toJS()转换 |
部分场景下会转换为Lua Table, 需要用:toobjc() 转为OC对象 |
|
void (^JSBlock) (NSDictionary *dict) |
var block = block(“NSDictionary * ”, function(dict){ … }) |
local block = toblock( function(dict) … end,{“void”,”NSDictionary”} ) |
|
block调用 |
block({v : ”6.5.0”}) |
block({v = ”6.5.0”}) |
|
在block里使用self |
var slf = self; block(function(){ slf.doSomething(); }); |
正常使用 |
|
__weak / __strong |
var weakSelf = __weak(self); self.setCompleteBlock(block(function(){ var strongSelf = __strong(weakSelf); strongSelf.doSomething(); })) |
不需考虑 |
|
GCD |
dispatch_after(1.0, function(){ // do something }) dispatch_async_main(function(){ // do something }) dispatch_sync_main(function(){ // do something }) dispatch_async_global_queue(function(){ // do something }) |
luaSetWaxConfig({openBindOCFunction=true}) dispatch_async(dispatch_get_global_queue(0, 0), toblock( function( ) // do something end)); |
|
传递id * 参数 |
var pError = malloc(sizeof("id")) NSJSONSerialization.JSONObjectWithData_options_error(data,1,pError); var error = pval(pError) releaseTmpObj(pError) free(pError) |
暂无 |
|
Super |
self.super().viewDidLoad(); |
self.super:viewDidLoad() |
|
Dealloc |
无法使用 |
||
断点调试 |
通过Safari的Web检查器调试 非常简单易用 |
ZeroBraneStudio ,至今还未成功过 |
|
加载和更新服务 |
自带JSPatch Loader ,使用RSA加密,根据版本号配置 https://github.com/bang590/JSPatch/wiki/JSPatch-Loader-使用文档 |
我们自己的HotPatch |
|
多线程 |
JavaScript 语言是单线程的,在 OC 使用 JavaScriptCore 引擎执行 JS 代码时,会对 JS 代码块加锁,保证同个 JSContext 下的 JS 代码都是顺序执行。所以使用 JSPatch 替换的方法都会在这个锁里执行,无法并行执行,这导致如果主线程和子线程同时运行了 JSPatch 替换的方法,子线程就会卡住主线程。 |
defineClass('JPClassA', { methodA: function() { //主线程 }, methodB: function() { //子线程 var limit = 20; //等待主线程JS解锁后 在OC调用,然后JS加锁,执行剩下Block回调 return self.performSelectorInOC('readData', [limit], function(ret) { var count = ret.count(); return {data: ret, count: count}; }); } }) // .performSelectorInOC(selector, arguments, callback) 可无限嵌套 |
支持多线程 |
C方法 |
支持GCD及部分内存/指针相关方法 自行添加需要写接口 |
支持部分常用C方法,自行添加需要写接口 |
|
可变参数 |
不支持,需要有固定数量参数的方法支持。 |
||
开发成本 |
有工具直接从OC语法转换,转换只支持简单语法。 IDE工具比较多 |
一行一行写。IDE工具少。 |
以上是关于JSPatch VS Wax的主要内容,如果未能解决你的问题,请参考以下文章