代码内存泄露检测(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++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...
随机推荐
- C# 可为空?及(??、?. )
可空类型修饰符(?): 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空. 例如:string str=null; 是正确的,int i=null; 编译器就会报错. 为了使值类型也 ...
- RookeyFrame Bug 线上创建的DLL被删除了 模块无法删除 临时解决
不知道什么情况 在线创建模块,DLL被删除了,但是模块的相关数据无法删除.可以按照下面的方法临时用一下. 产生这个的原因,好像是Config里面的NeedInit一直都是true,没有改为false, ...
- sudo与用户权限
sudo,以root的身份另起新进程 注意:cd是shell内置的,不会另起新进程,故sudo cd会提示找不到命令 sudo使用当前用户密码,su使用切换用户的密码,默认切换为root sudo通常 ...
- P3388 【模板】割点(割顶)&& 桥
题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...
- 《挑战30天C++入门极限》C++中类的多态与虚函数的使用
C++中类的多态与虚函数的使用 类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持 ...
- 《挑战30天C++入门极限》新手入门:关于C++中的内联函数(inline)
新手入门:关于C++中的内联函数(inline) 在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数. 可能说到这里,很 ...
- [HackTheBox]WEB题目
0x01 [50 Points] I know Mag1k 问题描述: Can you get to the profile page of the admin? 访问分配的地址,是一个带注册的登入页 ...
- 【CSP模拟赛】避难向导(倍增lca&树的直径)
耐力OIer,一天7篇博客 题目描述 “特大新闻,特大新闻!全国爆发了一种极其可怕的病毒,已经开始在各个城市 中传播开来!全国陷入了巨大的危机!大量居民陷入恐慌,想要逃到其它城市以 避难!经调查显示, ...
- 基于Redis的分布式锁到底安全吗(下)?
2017-02-24 自从我写完这个话题的上半部分之后,就感觉头脑中出现了许多细小的声音,久久挥之不去.它们就像是在为了一些鸡毛蒜皮的小事而相互争吵个不停.的确,有关分布式的话题就是这样,琐碎异常,而 ...
- Java初级黄金体验 其二
Java初级黄金体验 其二 引言:让我们看一下你的C盘有多少个文件和文件夹 初级 Java IO : 第一个纪念碑 小程序大致功能 让我们看一下E盘有多少个文件 上代码 最近太多的作业 代码可以无限改 ...