每次项目编译完成之后,都被内存搞得头昏脑胀,压力甚大。

利用两周时间,稍微研究了 微信开源的 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开源)的更多相关文章

  1. 代码内存泄露检测工具(linux gcc + valrind)

    参考博客: https://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111248.html linux命令如下:valgrind --tool ...

  2. 【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类

    背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题.我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题.视图和控制器相关的内存泄露,几乎都不存在了.后来想着一直就那个工 ...

  3. 精准 iOS 内存泄露检测工具

    MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22   |   zepo   |   23 Comments 背景 平常我们都会用 Instrument 的 Lea ...

  4. vld,Bounds Checker,memwatch,mtrace,valgrind,debug_new几种内存泄露检测工具的比较,Valgrind Cheatsheet

    概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...

  5. memwatch内存泄露检测工具

    工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态 ...

  6. Visual C++内存泄露检测—VLD工具使用说明[转]

    Visual C++内存泄露检测—VLD工具使用说明 一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...

  7. 【转】c++内存泄露检测,长文慎入!

    原文网址:http://blog.csdn.net/zengraoli/article/details/8905334 关于内存泄露的,今天无意想到,网上找了一下   本篇blog附带的所有工具和代码 ...

  8. Visual C++内存泄露检测—VLD工具使用说明

    一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还 ...

  9. vld(Visual Leak Detector) 内存泄露检测工具

    初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...

随机推荐

  1. 数据库(以MySQL为例)

    一.数据库简介 数据库就是数据的仓库,用来按照特定的结构去组织和管理数据,有了数据库可以更加方便.便捷的操作需要保存的数据 不管是什么数据库,最终都是将数据保存到硬盘中,只是存储的格式不同于文本文件 ...

  2. 83: 模拟赛 树形dp

    $des$ $sol$ 维护每个点的子树中的信息以及非子树的信息 $code$ #include <bits/stdc++.h> using namespace std; #define ...

  3. loj #10131

    抽离题意 求删除一条树边和一条非树边后将图分成不连通的两部分的方案数 对于一棵树,再加入一条边就会产生环.若只有一个环,说明只加入了一条非树边 (x, y),记 lca 为 l, 那么 对于任意一条 ...

  4. Firefox修復QQ快速登錄

    中了一次毒,然後火狐裏面就不能用QQ的快捷登錄了,後找到修復方法: 將QQ的四個文件放入火狐的插件文件夾裏面即可. 1.QQ文件目錄: C:\Program Files (x86)\Tencent\Q ...

  5. mpvue开发小程序

    实例生命周期 beforeCreate created beforeMount mounted beforeUpdate updated activated deactivated beforeDes ...

  6. [DOM] Input elements should have autocomplete attributes (suggested: autocomplete='tel', confirm at

    译文概要:输入元素应该有自动完成的属性,比如: autocomplete=’tel’. autocomplete 用途: 此功能主要是记住输入内容,下次提交表单或者浏览器回退后,还能保持表单内容不变. ...

  7. Java 输入流和字符串互相转换

    import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; impo ...

  8. css,js 学习记录

    记录一些自己曾经阅读,值得收藏的网址 --(css3新特性) https://segmentfault.com/a/1190000010780991#articleHeader41 --CSS3 3D ...

  9. java 静态数组 和非静态数组的区别

    区别:1,数组创建时间不同,静态的是一定义出来就创建了,动态的则是定义时不创建,使用时才创建,一定意义上节省了内存空间.2,使用场景不同,一开始就知道数组长度的使用静态初始化,反之,动态初始化. 静态 ...

  10. useEffect 实现 componentWillUnmount生命周期函数(四)

    在写React应用的时候,在组件中经常用到componentWillUnmount生命周期函数(组件将要被卸载时执行).比如我们的定时器要清空,避免发生内存泄漏;比如登录状态要取消掉,避免下次进入信息 ...