JSPatch 技術要點

做者:幹掉crash
連接:https://zhuanlan.zhihu.com/p/21884786
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

若是有方法不遵照語言規則呢?實際上在 JS 界,有個很經常使用的伎倆,就是預編譯:vue


也就是咱們寫的腳本不直接拿給 JS 引擎執行,而是進行一些轉換後才執行,在現代框架這個用法很常見, react/vue 都用了,甚至還有像 coffieScript 這樣把 JS 徹底換成另外一種語言的作法。react

想到這一點,剛纔的問題就很好解決了。ruby

只須要把全部函數調用在執行前都替換一遍,變成去調用一個固定的 __c 函數, 這個 __c 函數模擬了 ruby/lua 等語言的元方法機制,對方法調用進行轉發。框架

仍是以調用 UIView 的 alloc 方法爲例,這個語句在執行以前會被替換爲調 UIView 的 __c 方法,把 「alloc」 做爲字符串參數穿進去,在 __c 方法裏判斷調用者 UIView 是否是 OC 對象。若是是,就把類名和傳進來的方法名傳到 OC 層進行調用,若是不是,就調用回 JS 這個對象的方法。函數

這樣作簡潔高效地解決了前面的問題,不須要去 OC 遍歷每一個類的方法,不須要存儲這些方法,就能夠調用任意 OC 方法,只須要給 JS 基類定義一個 __c 方法就能夠了。正則替換後不管調用 OC 的什麼方法,都不會有語法錯誤,由於都變成調用這個 __c 方法,在這個 __c 方法裏作處理去 OC 層調用相應的方法就好了。lua

相關文章
相關標籤/搜索