JSPatch原理解析(基础篇)

JSPatch虽然已经被苹果明令ban掉了,但是其本身的机制对于大家理解跨平台开发还是有很大的帮助的,bang大神虽然自己也写过原理详解,但是对于我等小白来说还是有点难懂其具体原理,所以自己下功夫研究了很久js和这个框架写一篇解析给自己留做备忘也给和我一样在路上的iOS小白们提供一些参考,本篇仅是把大家以后可能遇到的问题先解决一下

JSPatch的实现基础是iOS的运行时机制,所有的类和变量都可以在运行时动态添加,JSPatch做的工作就是通过js和oc的交互然后动态的为运行时添加类和方法,具体请自行查找运行时的相关资料

JSPatch主要用到了一个叫JavascriptCore的库,这个库是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境,以下引用一下JamesYu的文章,写的很清楚http://www.jianshu.com/p/a329cd4a67ee
拿JSPatch中的代码举例如下

//OC 在context中注册一个叫_OC_callI的方法,方法实现就是等号后面的block
    context[@"_OC_callI"] = ^id(JSValue *obj, NSString *selectorName, JSValue *arguments, BOOL isSuper) {
        return callSelector(nil, selectorName, arguments, obj, isSuper);
    };
//在js中调用该方法
 var ret = instance ? _OC_callI(instance, selectorName, args, isSuper):
                         _OC_callC(clsName, selectorName, args)
//在JS中写一个方法
  var _formatOCToJS = function(obj) {
    if (obj === undefined || obj === null) return false
    if (typeof obj == "object") {...
//在OC中调用js的方法
return [[JSContext currentContext][@"_formatOCToJS"] callWithArguments:@[formatOCToJS([JPBoxing boxWeakObj:obj])]];

而且JSPatch中的所有带OC的方法都是js调用的oc的方法
另一个对于刚开始看JSPatch的iOSer来说比较难得点是js的一些问题,虽然我原来也接过前端外包写过页面,但是看到这个代码还是有很多疑惑的,比如在jspatch.js里面的代码是这样的

var global = this
;(function() {
...
}()

1.上述代码有什么作用?
function(){}是一个匿名函数,而(function() {})()可以把匿名函数封装成表达式并自我执行
首先用闭包是为了避免全局变量污染,比如如果在一个js文件里面定义了一个a变量,之后又引入一个js文件里面也定义了一个a变量,这样就会把第一个文件里面的变量覆盖掉,使用闭包就不会出现这种问题了,闭包后加一个()就可以直接执行代码这个大家应该都知道
2.为什么要有一个分号在闭包头?
匿名函数附近使用括号或一些一元运算符的惯用法,就是来引导解析器,指明运算符附近是一个表达式。但是;开头的并不常用加分号是为了避免被用做函数执行或下标运算
3.那个global = this有什么用?
将上下文this赋值给global,就可以在下之后的匿名函数中把全局变量绑定到global上方便调用

var _customMethods = {
_c: function(methodName) {...}
super: function() {...}
}

4.上述代码是什么?
在js中用下图这样的键值对形式定义一个对象,上述代码其实就是一个对象,键对应的值是一个匿名函数

var person={
firstname : "Bill",
lastname  : "Gates",
id        :  5566
};

5.JSPatch源码中用到的js的apply方法和call方法是什么?
这里有详解http://uule.iteye.com/blog/1158829
6.js里的arguments是什么?
arguments是一个特殊的js对象,可以获取传入的参数,哪怕你没有显示的声明需要传入的参数,例如

function test() {
  alert(arguments.length);//显示2
}
test(1,2)

7.Array.prototype.slice.call()有什么用?
该方法课可以将包含长度的js对象转变成数组例如

var a={length:2,0:'zero',1:'one'};
b = Array.prototype.slice.call(a);//b = ['zero','one']

8.js中的this定义
js中的this和oc中的self有很大的不同,oc中的self一直会指代的是本类本对象,即使在变量的set,get方法中也不例外,但是js中的this则指代的是最近的本对象,比如在set,get中使用this指代的是调用set和get的对象

之后几篇会按照JSPatch提供的demo代码进行一步一步讲解JSPatch的运行流程,日后有什么想到的难点我会更新在这里,之后的文章也不会对运行时如何创建类添加方法进行赘述,主要讲解JSPatch是如何将js代码变成构建类所需的参数,及方法转发的,有什么理解的不到位的地方还请大家多多指教

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容