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) {
}));
},
});
还是有缺陷,就是其实也不能立刻被回收,总要过个几秒。