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呼叫介面,訊息傳遞,物件持有和轉換,引數轉換這五個方面