JSPatch原理解析(基礎篇)

JSPatch雖然已經被蘋果明令ban掉了,但是其本身的機制對于大家理解跨平臺開發還是有很大的幫助的,bang大神雖然自己也寫過原理詳解,但是對于我等小白來說還是有點難懂其具體原理,所以自己下功夫研究了很久js和這個框架寫一篇解析給自己留做備忘也給和我一樣在路上的iOS小白們提供一些參考,本篇僅是把大家以后可能遇到的問題先解決一下

JSPatch的實現基礎是iOS的運行時機制,所有的類和變量都可以在運行時動態添加,JSPatch做的工作就是通過js和oc的交互然后動態的為運行時添加類和方法,具體請自行查找運行時的相關資料

JSPatch主要用到了一個叫JavascriptCore的庫,這個庫是webkit的一個重要組成部分,主要是對JS進行解析和提供執行環境,以下引用一下JamesYu的文章,寫的很清楚http://www.lxweimin.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閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容