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的主要内容,如果未能解决你的问题,请参考以下文章

JSPatch

JSPatch开源经验分享

热修复JSPatch之实战教程

热修复JSPatch之实战教程

JSPatch - 基本使用和学习

JSPatch被拒之完美解决方案