上文我们提到了检测内存泄漏的工具,下面我们就介绍一些常见的内存泄漏问题.
1. Block
关于 block 导致的循环引用问题是本人遇到的最多的导致内存泄漏的原因,相信大部分人可能都遇到过.这里我们不再对其成因进行一一赘述,只列几项需要注意的地方:
某个类将 block 作为自己的属性变量,然后该类在 block 的方法体里面又使用了该类本身(例:自定义 View,MJRefresh等).
一个单例持有的 block,并且 block 内又使用了 ViewController 这个类.
如果方法中参数是 block 或一些系统的 block 则不需要我们处理.
2. delegate
delegate 循环引用问题只需注意将代理属性修饰为 weak 即可.类似的可能有童鞋使用 superVC 这样的属性也都需要 weak.
3. NSTimer
我们都知道定时器使用完毕时需要将其停止并滞空,但是不要将这个时机放在 dealloc 里,会造成了互相等待的场景,无法释放.
4. 非 OC 对象
CGImageRef(对应调用CGImageRelease),CGContextRef(对应调用CGContextRelease),CGColorSpaceRef(对应CGColorSpaceRelease) 等,需要手动释放.
5. 踩过的其它坑
适时使用 autoReleasePool
一些系统的回调适时释放(例:UIAlertController)
viewWillAppear 对应 viewWillDisappear,不是 back 方法,说多了都是泪.