JSPatch

2016.9.23


JSPatch是一个iOS动态更新框架,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何oc原声接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原声代码动态修复bug

基础原理

JSPatch能做到通过JS调用和改写OC方法最根本的原因是oc是动态语言,oc上所有方法的调用/类的生成都通过oc runtime在运行时进行,可以通过类名/方法名反射得到相应的类和方法:

Class class = NSClassFromString("UIViewController");

id controller = [class alloc] init];

SEL selector = NSSelectorFromString("viewDidLoad");

[controller performSelector:selector];

也可以替换某个类的方法为新的实现:

static void newViewDidLoad(id slf, SEL sel) {}

class_replaceMethod(class, selector, newViewDidLoad, @"");

还可以新注册一个类,为类添加方法:

Class cls = objc_allocateClassPair(superCls, "JPObject", 0);

objc_allocateClassPair(cls);

class_addMethod(cls, selector, implement, typedesc);

理论上可以在运行时通过类名/方法名调用任何oc方法,替换任何类的实现以及新增任意类。所以JSPatch的基本原理就是:JS传递字符串给oc,oc通过runtime接口调用和替换oc方法。这是最基础的原理。

接下来看具体怎样实现的

方法调用

require('UIView')

var view = UIView.alloc().init()

view.setBackgroundColor(require('UIColor').grayColor()

view.setAlpha(0.5)

引入JSPatch后,可以通过JS代码创建了一个UIView实例,并设置背景颜色和透明度,涵盖了require引入类,JS调用接口,消息传递,对象持有和转换,参数转换这五个方面

你可能感兴趣的:(JSPatch)