JavascriptCore 调用 callWithArgume
2018-07-23 本文已影响337人
oneYing
最近接手一个工程。使用的JavascriptCore架构与js交互。由于数据请求都在原生这边,所以交互很频繁,经常在短时间内就会发生多次oc->js->oc 或者js->oc->js的调用。其中在有些页面,当oc通过callWithArguments方法调用js方法时,就会报bad_access 的crash. 而此时xcode只会显示一堆堆栈信息,且每次crash的信息都不一样,有时是webcore_WTF stackoverflow,有时候是webcore renderblock. 根据这些信息只能看出是webview在渲染加载html时出错。
一开始我觉得可能是调用js方法时是异步调用产生的,改为同步后也无效。再就是各种猜也没猜对。猜不对也就只好google了。在翻了好多页,改了多次关键词之后,终于在 Unreproducible webcore crashes找到了答案。评论里的这位朋友与我的一样

于是我将工程中所有调用oc调用js的方法里加入了setTimeout函数
function OCToJS(message) {
setTimeout(function () {
// js todo
}, 10)
}
在我搜索问题中,也发现有好多人遇到过类似的问题。但他们的解决方式于我并不适用,但也这里记录下来。
1、评论里的哥们把开源库中,崩溃的位置找到了
javascript源码
2、使用了cordova第三方库的
使用这个库且在css里设置了box-shadow 属性
另外,在调用callWithArguments时,我传的对象要等好久才会被释放,我查好多资料都没有找到解决方法,看似是框架的设计本是如此。