最近项目中需要混合开发,加载H5页面,比较UIWebView与WKWebView,WK还是不错的,果断试手,碰见一些坑,例如本文中说的内存溢出,OC中是dealloc方法没有执行,swift中析构函数deinit没有执行,搜了几篇文章,多谢糊涂猫until大大的文章,stackoverflow上的文章,大致原因就是下面这段代码,ScriptMessageHandler的代理为当前控制器,导致无法释放。
OC
1.参考几篇文章,第一种解决方案是在页面消失后,移除ScriptMessageHandler的代理,以下是代码。
写完之后就会发现dealloc方法已经调用了。
2. 第二种方法,比第一种麻烦一点,就是需要对代理进行弱引用,怎么做呢? 新建类LeakAvoider 继承NSObject,遵守WKScriptMessageHandler协议 下面是代码
有了这个类之后 ,就是在viewController中调用了,很简单!下面是用法
OK,写完之后,运行,发现 的dealloc正常执行了,如果控制器中对WKWebView进行进度条 标题、加载状态进行监听的话,需要在dealloc中移除监听。OK,OC版的已经结束了,下面是swift版本解决方案。
swift版
1.同OC一样 在viewcontroller的页面消失后,需要移除移除ScriptMessageHandler的代理,做法在下面代码中展示。
写完之后,deinit就可以执行了。
第二种方案,同样是创建新类,继承NSObject ,遵守WKScriptMessageHandler,下面是代码
写完之后就是用法,直接上代码
写完之后deinit析构函数就可以正常执行了,结束。
第一次在简书写文章,写的不是很熟练,加上这个功能也很普通,只是练练手,里面的代码一些事直接copy过来,不要在意这些细节,在接下的文章中会写WKWebView的缓存的坑,清理缓存,并且会写OC与JS交互,互传数据,包括webViewjavaScriptBridge的使用,希望给大家带来帮助。