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
- jspatch 的简单原理理解
- JSPatch Platform平台的简单使用
- mDNS 原理的简单理解
- mDNS原理的简单理解
- mDNS原理的简单理解
- Socket原理的简单理解
- mDNS原理的简单理解
- #Git原理的简单理解
- JSPatch 实现原理详解
- JSPatch 实现原理详解
- JSPatch原理说明
- JSPatch实现原理详解
- JSPatch实现原理详解
- JSPatch使用原理详解
- JSPatch 实现原理详解
- JSPatch 实现原理详解
- JSPatch 实现原理详解
- JSPatch 实现原理详解
- 解决Android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题
- PHP 打印函数之 print print_r
- struts2使用AbstractInterceptor实现拦截器
- RGB和HSV区别与互相转换
- ios runtime
- jspatch 的简单原理理解
- Android官方开发文档Training系列课程中文版:与其它APP交互之允许其它APP启动你的Activity
- 机器人--机器视觉的魅力
- opengl之绘制一个矩形
- Struts2使用MethodFilterInterceptor来实现方法拦截器
- ubuntu9.10使用apt-get时找不到下载源问题
- c++Primer5,类设计者的工具
- CAGradientLayer基本使用方法
- 【暑假】[网络流]网络流知识总结