iOS 内存调试Debug Memory Graph

1、作用

可在程序运行时,排查和定位内存泄漏问题。

2、打开Malloc stack logging

打开此设置可以backtrace对象堆栈信息。


WechatIMG121.jpeg

3、排查循环引用

下面代码存在循环引用问题。导致内存不释放。

@implementation ThirdVC

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    NSMutableArray *arr1 = [NSMutableArray array];
    NSMutableArray *arr2 = [NSMutableArray array];
    [arr1 addObject:arr2];
    [arr2 addObject:arr1];
}

- (void)dealloc {

    NSLog(@"ThirdVC dealloc");
}

@end
WechatIMG122.jpeg

WechatIMG123.jpeg

4、排查更隐秘的循环引用

下面代码存在定时器循环引用问题。导致内存不释放。
但是,这种内存泄漏问题,通过3方式,并不会排查出来。

#import "SecondVC.h"

@interface SecondVC ()

@property (nonatomic, strong) NSTimer *timer;

@end

@implementation SecondVC

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)dealloc {
    
    NSLog(@"SecondVC dealloc");
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
}

- (void)timerAction {
    
    NSLog(@"TimerAction");
}

@end

操作步骤:
1、HomeVC push SecondVC,点击屏幕开启定时器,然后返回。
2、HomeVC push SecondVC,点击屏幕开启定时器,然后返回。
3、HomeVC push SecondVC,点击屏幕开启定时器。


WechatIMG124.jpeg

WechatIMG125.jpeg

推荐阅读更多精彩内容