JavaScriptCorejavascript
jsc 其實就是蘋果 Safari 瀏覽器的 javascript 引擎, 主要負責 OC 與 JS 之間的交互java
OC 與 JS 交互(OC 調用 JS 代碼)瀏覽器
這是一段簡單的代碼 上面 import了 JSC 的框架, 而後建立了一個 JSContext 的對象, 而後用 context 執行了一段 js代碼, 執行後獲得了一個 jsValue 類型的值, 最後將這個值轉換爲整型並輸出, 這樣就完成了 OC 調用一段 JS 代碼框架
這裏有兩個對象須要注意:函數
JSContext: JSContext 是 js 代碼的執行環境爲 JS 代碼的執行提供了上下文環境, 經過 JSCore 執行的 JS 代碼都得經過 JSContext 來執行線程
JSContext 對應於 JS 中的一個全局對象,至關於瀏覽器的 window 對象. JSContext 中有一個 GlobalObject 屬性, 實際上 JS代碼都是在這個 GlobalObject 上執行的對象
JSValue: 是對 js 值的包裝,對應於 OC 中的類型, jsValue 是不能獨立存在的.必須存在於 JSContext 中blog
JSValue 對應的 JS 值和所處的 JSContext 對象都是強引用關係, 由於JSValue 須要這兩個東西來執行 JS 代碼, 因此 JSValue 會一直持有他們進程
JS與 OC 的交互ip
Block: 就是在傳遞給 js的方法裏暴露一個block給 js 調用
// 在 OC 裏 把一個 block 注入 JSContext
// 在 js裏調用 jsCore 會自動在全局對象中建立一個 makeNSColor 的函數, 將這個 block 包裝起來
// JSExport協議
經過 JSExport 協議能夠很方便的將 OC 中的對象暴露給 JS 調用, 且在 JS 中使用起來就像 JS 對象同樣
他的屬性能夠直接調用像 js 同樣, 實例方法能夠直接調用
實現這些只需寫一句話 @protocal MyPointExports <JSExport>
他的本質就是把 OC 類的屬性和實例方法 類方法添加都 JS 的原型鏈上
Tips: // 內存管理方面
不要在 JS 中給OC 對象增長成員變量 由於在 JS 中增長在 OC 中並不會同步增長
OC 中不要直接強引用 JSValue 對象 不要將一個 JSValue對象當屬性或者成員變量, 當這個 OC 對象暴露給 JS 的時候會形成循環引用, 由於前面說過 JSValue對 JSContext 是強引用的
蘋果推出了一種新的引用關係 有條件的強引用 蘋果使用 JSManagedValue 來包着一個 JSValue 對象就能夠
// 線程方面
JSVirtualMachine 他爲 js的運行提供了底層資源, 有本身的堆棧和垃圾回收機制
JSVirtualMachine仍是 JSContext 的容器 能夠包含若干個 JSContext, 在一個進程能夠有多個JSVirtualMachine, 裏面包含若干個 JSContext, 而 JSContext 中又有若干個 JSValue, 須要注意的是能夠在同一個 JSVirtualMachine的不一樣 JSContext 中互相傳遞 JSValue ,可是不能再不一樣的JSVirtualMachine中的 JSContext 之間傳遞 JSValue