首先要明确下基本定义,什么叫内存泄漏?
- 内存泄漏(memory leak) :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
- 内存溢出(out of memory) :是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。
排查方法
静态分析
通过Xcode
打开项目,然后点击product -> Analyze 分析,
静态分析方法能发现大部分的问题,但是只能是静态分析结果,有一些并不准确,还有一些动态分配内存的情形并没有进行分析。所以仅仅使用静态内存泄漏分析得到的结果并不是非常可靠,如果需要,我们需要将对项目进行更为完善的内存泄漏分析和排查。那就需要用到我们下面要介绍的动态内存泄漏分析方法Instruments中的Leaks方法进行排查。
动态分析
静态分析不能把所有的内存泄露排查出来,有的内存泄露是在运行时,用户操作时才产生的。那就需要用到Instruments了。具体操作是通过xcode打开项目,然后点击product–>profile。
dealloc分析
通过在dealloc
打印,来确定当前类是否被释放
借助于第三方库检测
借助于第三方库检测,如 FBRetainCycleDetector 、 OOMDetector 等
常见内存泄漏原因
- ViewController 中存在NSTimer
- ViewController 中的代理delegate
- ViewController 中Block
- ViewController 的子视图对self的持有
- ViewController 之间的循环引用