iOS DeveloperiOS进阶

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

2017-01-11  本文已影响160人  西蒙SIMON

使用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) {
                                                                      
                                                                      }));
    },
});

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

上一篇下一篇

猜你喜欢

热点阅读