如何解决 (IOS)UIWebview 内存泄漏

来源:互联网 发布:淘宝客服每日工作小结 编辑:程序博客网 时间:2024/05/10 16:35

哈哈,其实详细的代码已经给了出来:http://blog.csdn.net/yeshennet/article/details/52413517

这里补一点当时出现的情况吧:

一开始是测试说手机用久了以后会卡,还有就是会闪退,会黑屏,出现一些奇奇怪怪的毛病。问题很严重,而且是用久了以后,听描述是偶发的。后来我用xcode中的工具查看了一下内存,如下图:

每打开一个页面就会出现增加一点内存,退出也不会消失。是内存泄漏无疑了。

上网找了一下资料,都是什么“苹果官方都承认的内存泄漏。而且苹果也心虚了,给了一个WKWebview用来替代UIWebView”


所以解决的第一个步骤就是无缝切换到wkwebview

我动手封装了一下,识别了一下IOS的版本,IOS8+的就切换到wkwebview。

没想到这么一切换,出了问题。(切换wkwebview的注意点)“AController中的wkwebview” 和 “BController中的wkwebview”的localstorage信息不一致。

什么意思呢,就是在B中保存了数据,回到A中,数据没同步到。

貌似真的无解.....

只能一个个API查看(怎么查看?https://developer.apple.com/reference/webkit/wkwebview)

后来发现一个东西有点可疑wkwebviewconfiguration。(https://developer.apple.com/reference/webkit/wkwebviewconfiguration)

其中有一个值,processPool,描述是:The process pool from which to obtain the view’s Web Content process.

再搜了一下,stackoverflow上有关于的cookie的问答刚好和这个有关,处理方法是将config中的processPool变为单例。

然后我也弄成单例,然后问题就解决了。


然后IOS7怎么办?

解决的第二个步骤检查是否存在循环引用

哈哈,我也是切换过去才知道原来内存泄漏是有解的。

最初也是试了一轮网上的方案,然后都没什么用。

就在我尽人事听天命的时候,我在controller退出的时候,手动置空了所有引用。在页面返回的时候强制清了一轮缓存

NSUserDefaults.standardUserDefaults().setInteger(0, forKey: "WebKitCacheModelPreferenceKey")NSUserDefaults.standardUserDefaults().synchronize()
然后再去看内存,还是会增长,不过已经平和了很多,页面返回内存也会降低回去。

是什么原理呢?

我猜是controller中有uiwebview的强引用。

uiwebview中也保留的controller的回调入口。

然后这两个东西就循环引用了,就没被回收。


以上。





0 0
原创粉丝点击