JSPatch原理学习
基础原理
OC为动态语言,OC上所有的方法调用/类的生成都通过Objective-C Runtime在运行时进行,可通过类名/方法名反射得到相应的类和方法:
Class class = NSClassFromString(@"UIViewController");
id vc = [[class alloc] init];
SEL sel = NSSelectorFromString(@"viewDidLoad");
[vc performSelector:sel];
替换方法实现:
class_replaceMethod([self class], @selector(viewDidAppear:), (IMP)myViewDidApplear, "v@:B");
void myViewDidApplear(id self, SEL _cmd, BOOL animation){NSLog(@"myViewController");}
注册新类
Classcls =objc_allocateClassPair(superCls,"JPObject",0);objc_registerClassPair(cls);class_addMethod(cls, selector, implement, typedesc);
方法调用
require('UIView')
var view=UIView.alloc().init()
view.setBackgroundColor(require('UIColor').grayColor())
view.setAlpha(0.5)
require
在js全局作用域上创建一个同名的变量,变量指向一个对象,对象属性__clsName保存类名,同时表示这个对象是一个OC Class
调用接口
在OC执行脚本之前,将所有方法调用转换成调用__c()函数。js中调用OC的方法统一都经过__c()函数调用。
UIView.alloc().init()->UIView.__c('alloc')().__c('init')()
__c()中根据不同类型判断进行不同操作,_methodFunc就是把相关信息传递给OC,OC使用runtime调用相关接口
return _methodFunc(slf.__obj, slf.__clsName, methodName, args, slf.__isSuper)
_methodFunc中针对实例方法和对象方法进行不同处理
var ret = instance ? _OC_callI(instance, selectorName, args, isSuper):_OC_callC(clsName, selectorName, args
在+ (void)startEngine方法中对js方法进行处理