内存泄露的相关概念:
如果程序运行时一直分配内存而不及时释放无用的内存,程序占用的内存越来越大,直到把系统分配给该APP的内存消耗殚尽,程序因无内存可用导致崩溃,这样的情况我们称之为内存泄漏。
内存泄露可能引发的问题:
1)内存消耗殆尽的时候,程序会因没有内存被杀死,即crash。
2)当内存快要用完的时候,会非常的卡顿。
3)如果是ViewController没有释放掉,引起的内存泄露,还会引起其他很多问题,尤其是和通知相关的。没有被释放掉的ViewController还能接收通知,还会执行相关的动作,所以会引起各种各样的异常情况的发生。(这一点尤为重要,项目中重点关注)
常见的检测监测方法:
1.Analyze静态分析:通过静态分析我们可以最初步的了解到代码的一些不规范的地方和一些代码逻辑上的错误;
2.Leaks,Xcode自带工具。
3.MLeaksFinder,来自微信阅读团队的监测工具,比较精准。有友好的弹框提示,可以定位到相关的类和发生内存泄露的步骤。
常见循环引用:
1.NSTimer:创建定时器时,当前控制器引用而定时器了(为什么因引用定时器?后续要用到这个定时器对象),在给定时器添加任务时,定时器保留了self(当前控制器).这里就出现了循环引用.解决方法:控制器不再引用定时器(不太可能) ,定时器不再保留当前控制器(较为科学,直接停止掉即可)
2.GCD计时器,使用GCD的定时器,要注意使用weakself。
3.VC的内存泄露。解决方法:想要知道ViewController有没有被释放,一个方法就是可以通过看ViewController有没有执行dealloc方法。
4.block内存泄露。解决方法:打断引用循环关系。
5.delegate内存泄露。weak弱引用即可。
6.NSNotification内存泄露:weak弱引用即可。
具体内存问题和解决方案可以看我的github上面的Demo。附上Demo地址,欢迎提出宝贵意见。
demo的github地址:点击打开链接