哈哈,其实详细的代码已经给了出来:
这里补一点当时出现的情况吧:
一开始是测试说手机用久了以后会卡,还有就是会闪退,会黑屏,出现一些奇奇怪怪的毛病。问题很严重,而且是用久了以后,听描述是偶发的。后来我用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的回调入口。
然后这两个东西就循环引用了,就没被回收。
18年2月更新
曾被问到内存泄漏是什么问题,之前技术分享的时候,福哥给了一个解释:
就是你有十万元存在银行,但是你的银行卡弄丢了,你也忘记有这回事了。
我是这样理解的:
1,从系统层面来看,你的内存还是你在用着,你被强杀,内存自然就可以被释放。
2,从用户程序的角度,你或许已经没办法把钱收回来了,只能怪写代码的时候把“卡”写扔了。
在框架中、有生命周期的程序中、线程中,内存泄漏还是一个值得注意的问题。