检测方案
手动检测
手动检测,实现 dealloc 方法,离开当前类是否会调用;
可以实现 ViewController 的分类,在分类里面实现 -(void)dealloc , 在离开页面是看是否有信息打印,如果打印则证明当前类没有内存泄漏问题
```
- (void)dealloc {
NSLog(@"%s", __func__);
}
```
工具检测,使用 Xcode 自带的工具进行检测;
静态内存泄漏分析方法
1、逻辑错误:访问空指针或未初始化的变量等;
2、内存管理错误:如内存泄漏等;
3、声明错误:从未使用过的变量;
4、Api调用错误:未包含使用的库和框架
静态分析(Analyze):不运行程序,直接检测代码中是否有内存问题 (不一定百分百准确 结合实际问题 ,仅仅提供建议)
如果MRC下编译检测出很多问题 证明此公司的这个项目基础很差
动态内存泄漏分析方法
1.Time Profiler:CPU 分析工具分析代码的执行时间。
2.Core Animation:离屏渲染,图层混合等GPU耗时。
3.Leaks:内存检测,内存泄漏检测工具。
4.Energy Log:耗电检测工具。
5.Network:流量检测工具
1.运行程序,查看内存分配情况(Allocations)
2.动态分析(Profile == Instruments)
查看内存的分配情況 (Allocat ions )
* 可以查看做出了某个操作后(比如点击了某个按钮\显示了某个控制器),内存是否有暴增的情况(突然变化)
2.运行程序通过使用app来查看是否有内存泄露(Leaks)
自动化检测,自动检测出发生内存泄漏的地方,并打印出对应的信息;
1.主要用于检测循环引用 - FBRetainCycleDetector
2.主要用于快速检测潜在的内存泄漏对象,并提供给 FBRetainCycleDetector 进行检测 -FBAllocationTracker
常见的内存泄露场景:
目前,在 ARC 环境下,导致内存泄漏的根本原因是代码中存在循环引用,从而导致一些内存无法释放,最终导致 dealloc() 方法无法被调用。主要原因大概有一下几种类型:
1.Retain Cycle,Block 强引用
2.NSTimer使用不当
3.第三方提供方法造成的内存泄漏
4.CoreFoundation 方式申请的内存,忘记释放
如何让程序尽量减少内存泄漏
31 ARC
* Foundat ion对象(OC对象):只要方法中包含了alloclnewlcopy\mutableCopyl retain等关键字,那么这些方法产
生的对象,就必须在不再使用的时候调用1次release或者1次auto release
* * CoreFoundat ion对象(C对象)”:只要西数中包含了createlnewlcopy\retain等关键宇,那么这些方法产生的对象,
就必须在不再使用的时候调用1次CFRe lease或者其他release函数
, 2.ARC(只自动管理OC对象,不会自动管理C语言对象)
* CoreFoundat ion对象(C对象):只要函数中包含了createinewlcopyretain等关键宇,那么这些方法产生的对象,
就必须在不再使用的时候调用1次CFRelease或者其他release函数
*3.block的注意
* 11 block的内存默认在栈里面(系统自动管理)
» void (^test) () =
1:
11如果对block进行了Copy操作,block的内存会迁移到堆里面(需要通过代码管理内存)
"Block copy(test):
。 11在不需要使用block的时候,应该做1次release操作
A Block release(test):
[test releasel:
网友评论