美文网首页iOS DeveloperiOS进阶
JSPatch修复WKWebView代理方法造成内存泄漏

JSPatch修复WKWebView代理方法造成内存泄漏

作者: 西蒙SIMON | 来源:发表于2017-01-11 01:52 被阅读160次

    使用JSPatch修复了WKWebView的一个代理方法

    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
    

    结果webView就内存泄漏了,退出了VC之后仍然得不到释放,会造成例如退出控制器,网页音乐仍然不会停止的现象。经过多次试验,证实是JSPatch修复造成的。

    应该是js持有了webView对象,而我们不能控制js的垃圾回收,可以参考以下issue:
    https://github.com/bang590/JSPatch/issues/69

    注意bang大神有个回答,是执行一段js代码来触发js垃圾回收的:

    (function(){
      var x = {};
      for(var i = 0;i<10000;i++){
        x[i]=[];
      };
      x=null;
    })();
    

    不过我发现这个数量级,还是不够快,所以循环数我改成了
    i<999999999;

    可以在浏览器VC的dealloc方法上调用一次,来触发webView被释放,我这里还是用JSPatch进行修复:

    defineClass('WebVC', {
       webView_didFinishNavigation: function(webView, navigation) {
            //...
       },
        dealloc: function() {
            var js = "(function(){var x = {};for(var i = 0;i<999999999;i++){x[i]=[];};x=null;})();";
            self.webView().evaluateJavaScript_completionHandler(js, block('id,NSError*', function(obj, error) {
                                                                          
                                                                          }));
        },
    });
    

    还是有缺陷,就是其实也不能立刻被回收,总要过个几秒。

    相关文章

      网友评论

        本文标题:JSPatch修复WKWebView代理方法造成内存泄漏

        本文链接:https://www.haomeiwen.com/subject/ziblbttx.html