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方法进行处理

你可能感兴趣的:(JSPatch原理学习)