jspatch 的简单原理理解

来源:互联网 发布:udp端口号范围 编辑:程序博客网 时间:2024/05/17 23:40

作者:Love@YR 

链接:http://blog.csdn.net/jingqiu880905/article/details/51017142
请尊重原创,谢谢!


1.把需要运行的demo.js用正则表达式转换一下

方法的调用变成_c(‘methodName’)

2.如何知道一个js对象为oc类?
 调用(global.require)_require方法为这个js对象加个key:_isCls 并保存类名_clsName

3.如何知道一个js对象为oc对象
js对象的key _obj对应的值便是oc对象返回的指针,如果是oc类则没有这个key。这个key是oc调用了方法后再包装传给js的

4.如何表示一个js对象为oc某个对象的父类对象
js对象的key _isSuper如果为1则是其父类

3.如何调用方法

Object.prototype.__c


  js的对象基类加一个_c成员方法。这个方法说明如果此对象有_obj(代表其是oc对象转来的js对象)或者_clsName(代表其是oc类的对象)则告诉它要去调用oc方法。(否则就是普通的js绑定方法)。

如果调用的方法名为super则直接返回这个js对象设置其_isSuper为1

var args = Array.prototype.slice.call(arguments)

拿到参数(参数怎么拿到的不懂)


然后把_obj即包装过的oc方法返回的指针对象,类名,方法名,

var _methodFunc = function(instance, clsName, methodName, args, isSuper)


经过一系列动作拿到了方法的selectorName, 然后根据instance即_obj有无值选择调用_OC_callI或者_OC_callC 


4. 看一下js是如何让oc方法执行的

首先app启动时开启了js 引擎,创建了js的运行环境,并定义了几个方法,这些方法可以直接被js调用。(说的是调用这些方法时js参数类型和oc可以互转

以_OC_callI为例,分析下其所做的动作。


调用callSelector:

拿到是不是实例,是不是基础类型,拿到参数,拿到selector,然后invocation设置target ,设置selector ,拿到参数的类型指针设置参数,然后invoke执行方法调用,然后拿到returnValue,再把returnValue从oc对象指针放入dictionary中然后return回js。
js里 var ret = instance ? _OC_callI(instance, selectorName, args, isSuper):

                         _OC_callC(clsName, selectorName, args)

的ret即为返回。
然后再把这个dictionary转成的object转成js

就比如 require('UILabel').alloc().init();

这样就完成了js里调用_c(‘alloc’)-oc调用方法-oc返回结果(UILabel的对象指针)给js-js再把结果转成js对象-再调用_c(‘init’)方法

5.看一下js如何让oc重新定义某个方法的实现的

_OC_defineClass

没有此类,则注册一个,有的话则调overrideMethod,这个方法完全就是方法重组的案例。

1 0
原创粉丝点击