代码内存泄露检测(1) MLeaksFinder (Wechat开源) + FBRetainCycleDetector (FaceBook开源)
每次项目编译完成之后,都被内存搞得头昏脑胀,压力甚大。
利用两周时间,稍微研究了 微信开源的 MLeaksFinder 和 facebook 开源的 FBMemoryProfiler,
这两个开源三方,在编写过程中就可以检测内存泄露,实在是不要太方便……
希望自己在下一个项目能用的得心应手……
1. 微信 MLeaksFiner
如果对它,你还是不是很了解 ,可以到查阅这里: http://wereadteam.github.io/2016/07/20/MLeaksFinder2/ ;
1.1 创建demo 项目 LeakDemo 引入 MLeaksFiner 开源文件夹
->本次 我是直接下载到本地了,所以直接拖拽到了项目
1.2 引入这个开源文件后 ,不用写多余的代码,默认debug 编译的时候,自动启动使用
下面来写一段内存泄露的代码,进行试验::
内存泄露的代码::
在 main.storybord 中添加 NavigationController
VC 代码 ViewController .m ::
#import "ViewController.h"
#import "FirstController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; self.navigationItem.title = @"vc"; [self creatButton]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
} -(void)creatButton{ UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; [self.view addSubview:button]; button.center = self.view.center; [button setTitle:@"下一页" forState:UIControlStateNormal]; button.backgroundColor = [UIColor yellowColor]; [button addTarget:self action:@selector(didButtonClick:) forControlEvents:UIControlEventTouchUpInside]; } -(void)didButtonClick:(UIButton*)btn{ NSLog(@"vc btn Click"); [self.navigationController pushViewController:[FirstController new] animated:true];
}
新建 FirstController :
#import "FirstController.h"
#import "TestView.h" @interface FirstController () @property (nonatomic,strong)TestView *testView; @end @implementation FirstController - (void)viewDidLoad {
[super viewDidLoad]; self.navigationItem.title = @"first vc"; self.view.backgroundColor = [UIColor whiteColor]; [self addTestView];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; } -(void)addTestView{ self.testView = [[TestView alloc]initWithFrame:CGRectMake(0, 0, 200, 30)]; self.testView.vc = self; [self.view addSubview:self.testView]; self.testView.center = self.view.center;
}
@end
新建 TestView :
TestView .h
#import <UIKit/UIKit.h>
#import "FirstController.h" @interface TestView : UIView @property (nonatomic,strong)FirstController *vc;// 把这个属性 换成 strong 属性 故意造成 泄露 @end
TestView .m
#import "TestView.h" @implementation TestView - (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) { [self prepareUI];
}
return self;
} -(void)prepareUI{ self.backgroundColor = [UIColor redColor];
} @end
内存泄露的解释::::
vc -> push -> first VC
:( first vc 强持有 testView ,testView 强持有 firstVc : 彼此强持有,无法释放)
-> pop 回-> vc
=》: first vc 无法释放
1.3 检测 到泄露 alert 方式体提醒 :::
这里检测到是有 循环泄露的,但是无法准确定位泄露的对象
所以继续……
2 . MLeakFinder + FBRetainCycleDetector
2.1 查阅了 MLeaksFinder.h 的文件
这段宏定义的解释 https://www.jianshu.com/p/e3dbf58982f6:::
#ifdef MEMORY_LEAKS_FINDER_ENABLED //_INTERNAL_MLF_ENABLED 宏用来控制 MLLeaksFinder库
//什么时候开启检测,可以自定义这个时机,默认则是在DEBUG模式下会启动,RELEASE模式下不启动
//它是通过预编译来实现的
#define _INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED #else #define _INTERNAL_MLF_ENABLED DEBUG #endif //_INTERNAL_MLF_RC_ENABLED 宏用来控制 是否开启循环引用的检测
#ifdef MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED #define _INTERNAL_MLF_RC_ENABLED MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED //COCOAPODS 因为MLLeaksFinder引用了第三库用来检查循环引用,所以必须是当前项目中使用了COCOAP
//ODS,才能使用这个功能。
#elif COCOAPODS #define _INTERNAL_MLF_RC_ENABLED COCOAPODS #endif
2.2 . 添加cocopod ,然后 Pod 添加 FBRetainCycleDetector;
注释 这两段代码 == 》同时开启 MLeakfinder 检测 和 retainCycle 检测
//#define MEMORY_LEAKS_FINDER_ENABLED 0 #ifdef MEMORY_LEAKS_FINDER_ENABLED #define _INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED #else #define _INTERNAL_MLF_ENABLED DEBUG #endif //#define MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED 0 #ifdef MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED #define _INTERNAL_MLF_RC_ENABLED MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED #elif COCOAPODS #define _INTERNAL_MLF_RC_ENABLED COCOAPODS #endif
重新编译运行 弹框是这样
正确找到 循环引用 cycle
最简单的使用方法了吧,先使用着,有机会会研究下 源码 ^ V ^
代码内存泄露检测(1) MLeaksFinder (Wechat开源) + FBRetainCycleDetector (FaceBook开源)的更多相关文章
- 代码内存泄露检测工具(linux gcc + valrind)
参考博客: https://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111248.html linux命令如下:valgrind --tool ...
- 【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类
背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题.我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题.视图和控制器相关的内存泄露,几乎都不存在了.后来想着一直就那个工 ...
- 精准 iOS 内存泄露检测工具
MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22 | zepo | 23 Comments 背景 平常我们都会用 Instrument 的 Lea ...
- vld,Bounds Checker,memwatch,mtrace,valgrind,debug_new几种内存泄露检测工具的比较,Valgrind Cheatsheet
概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...
- memwatch内存泄露检测工具
工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态 ...
- Visual C++内存泄露检测—VLD工具使用说明[转]
Visual C++内存泄露检测—VLD工具使用说明 一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...
- 【转】c++内存泄露检测,长文慎入!
原文网址:http://blog.csdn.net/zengraoli/article/details/8905334 关于内存泄露的,今天无意想到,网上找了一下 本篇blog附带的所有工具和代码 ...
- Visual C++内存泄露检测—VLD工具使用说明
一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还 ...
- vld(Visual Leak Detector) 内存泄露检测工具
初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...
随机推荐
- greenplum 下载地址
一.推荐使用下面下载地址 https://network.pivotal.io/products/pivotal-gpdb#/releases/158026/file_groups/1083 二.官网 ...
- learning java Runtime 类 获取内存及处理器核数信息
var rt = Runtime.getRuntime(); System.*)); System.*)); System.*)); System.out.println(rt.availablePr ...
- RookeyFrame 信息 常用信息整理
博客 https://www.cnblogs.com/rookey/ gitee的地址: https://gitee.com/rookey/Rookey.Frame-v2.0 https://gite ...
- gdb tui设置默认窗口高度
gdb -p 12999 -tui 先显示win信息(输入:info win) 显示如下: SRC (35 lines) <has focus> CMD (17 lines) 我们要改的是 ...
- 备用shell管理方案之butterfly+nginx+https
安装butterfly+nginx https 1. 安装butterfly yum install python36 python36-pip python36-devel -y pip insta ...
- Oracle自动备份(多个库),压缩打包,删除原文件
1.创建一个database_Backup.bat文件,用记事本打开 内容参考如下:(楼主这里自动备份了四个数据库) set "now=%date:~0,4%%date:~5,2%%date ...
- Django基础(1)-虚拟环境的安装及配置
virtualenv介绍 (1)做什么的?virtualenv是用于创建独立的python环境,使得多个python应用彼此独立: (2)优点: a)使不同应用开发环境独立 b)环境升级不影响其他应用 ...
- 第02组 Alpha冲刺(3/6)
第02组 Alpha冲刺(3/6) 队名:無駄無駄组长博客作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的 ...
- 【洛谷】P3518 [POI2011]SEJ-Strongbox
题目描述 有一个密码箱,0到n-1中的某些整数是它的密码. 且满足,如果a和b都是它的密码,那么(a+b)%n也是它的密码(a,b可以相等) 某人试了k次密码,前k-1次都失败了,最后一次成功了. 问 ...
- C语言--二维数组
一.PTA实验作业 题目1:7-2 求整数序列中出现次数最多的数 1. 本题PTA提交列表 2. 设计思路 定义变量n表示输入整数个数,count表示每个数出现次数,i.j表示循环变量,k表示次数最多 ...