哈哈,其实详细的代码已经给了出来:

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

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

ios view方法 iphone webview_ios view方法

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

上网找了一下资料,都是什么“苹果官方都承认的内存泄漏。而且苹果也心虚了,给了一个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的回调入口。

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



18年2月更新

曾被问到内存泄漏是什么问题,之前技术分享的时候,福哥给了一个解释:

就是你有十万元存在银行,但是你的银行卡弄丢了,你也忘记有这回事了。

我是这样理解的:

1,从系统层面来看,你的内存还是你在用着,你被强杀,内存自然就可以被释放。

2,从用户程序的角度,你或许已经没办法把钱收回来了,只能怪写代码的时候把“卡”写扔了。


在框架中、有生命周期的程序中、线程中,内存泄漏还是一个值得注意的问题。