Instrument — Leaks,Allocations,Analyze
Analyze-静态分析工具
Product->Analyze(command+shift+B)
可以找出代码潜在错误,如内存泄露,未使用函数和变量等,还可以检测出一些内存泄漏问题,比如一些比较明显的循环引用,CF库对象未release等相对简单的问题,通常是在进行其他方式检测之前就使用的方式,把一些简单的问题先发现并处理了。
主要分析以下四种问题
- 逻辑错误:访问空指针或为初始化的变量等;
- 内存管理错误:如内存泄漏等;
- 声明错误:从未使用过的变量
- Api调用错误:未包含使用库和框架
Allocations工具是一个跟踪由应用程序分配的对象内存的工具。可以用来在疑似内存泄露的地方,通过反复操作,查看某些对象内存是否有被正常的释放,从而得知是否发生内存泄露。
Instruments-动态分析工具(product -> profile)
内存泄漏检测工具-Leaks
Instruments工具(command+I)-选择Leaks选项
选择Target,在右下角Display Setting面板的Call Tree,勾选Invert Call Tree和Hide System Libraries,方便接下来我们迅速查找有内存问题的代码段。
第三方工具
相对于系统工具,方便快速多了
一、MLeaksFinder
精准 iOS 内存泄露检测工具
https://github.com/Tencent/MLeaksFinder
直接拖入MLeaksFinder文件夹到工程即可
MLeaksFinder 新特性 https://wereadteam.github.io/2016/07/20/MLeaksFinder2/
MLeaksFinder的原理:
使用runtime方法交换,它swizzle了NavigationController的Push和Pop相关方法来管理viewController和view的生命周期, 在你Pop掉viewController的时候, 会执行这么一段代码
1 | __weak id weakSelf = self; |
3秒后执行 [weakSelf assertNotDealloc]; 如果这个时候view和viewController已经释放了, 那么weakSelf应该为nil, 所以将不会触发断言, 否则将会打印日志, 触发断言.
MLeaksFinder的原理还是很简单的, 它swizzle了NavigationController的Push和Pop相关方法来管理viewController和view的生命周期, 在你Pop掉viewController的时候, 会执行这么一段代码
1 | __weak id weakSelf = self; |
3秒后执行 [weakSelf assertNotDealloc]; 如果这个时候view和viewController已经释放了, 那么weakSelf应该为nil, 所以将不会触发断言, 否则将会打印日志, 触发断言.
OOMDetector
https://github.com/Tencent/OOMDetector
同样来自腾讯,OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。
【腾讯开源】iOS爆内存问题解决方案-OOMDetector组件
二、PLeakSniffer
iOS内存泄漏自动检测工具
https://github.com/music4kid/PLeakSniffer
在AppDelegate.m加入
1 |
|
三、使用Facebook开源检查工具FBRetainCycleDetector
使用的是MRC机制的文件,需要设置对应文件的Compiler Flags为-fno-objc-arc。
如何使用,使用FBRetainCycleDetector,需要将以上4个文件改成-fno-objc-arc
1 | FBBlockStrongLayout |