内存泄漏检测

2023-07-11  本文已影响0人  万万万万万万一

检测方案

手动检测

手动检测,实现 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:

上一篇下一篇

猜你喜欢

热点阅读