代码内存泄露检测(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++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...
随机推荐
- YAML_11 when条件判断
当系统负载超过0.7时,则关掉httpd ansible]# vim when.yml --- - hosts: cache remote_user: root tasks: - sh ...
- shell命令的原理
https://blog.csdn.net/m0_37925202/article/details/80258974 https://blog.csdn.net/a15929748502/articl ...
- copy()函数技术推演
/*** str_copy.c ***/ #include<stdio.h> void copy_str21(char *from, char *to) { for(; *from != ...
- [ThinkPHP6.*安装 (草稿先发布,再维护)
ThinkPHP6.0的安装,官方文档中有详细的说明,不过在安装之前,大家还是要做一些准备的,就是PHP本地开发环境 的搭建. 官方手册地址:https://www.kancloud.cn/manua ...
- LayuiAdmin 单页版关闭当前页面tab的方式-图文
需要关闭的时候 调用 parent.layui.admin.events.closeThisTabs() 即可执行当前页面的关闭 $.post("/index.php/WebAdmin/Wx ...
- Linux文件与文件夹的权限问题
0x01 修改文件可读写属性的方法 例如:把index.htm 文件修改为可写可读可执行: chmod 777 index.htm 要修改目录下所有文件属性可写可读可执行: chmod 777 *.* ...
- Vue编程基础
一.依赖环境搭建: 添加镜像 # 安装好node.js后,使用淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 项 ...
- 2019SDN课程阅读作业(2)
1.过去20年中可编程网络的发展可以分为几个阶段?每个阶段的贡献是什么? 分为三个阶段,第一个阶段是主动网络(从20世纪90年代中期到21世纪初),它在网络中引入了可编程功能,以实现更大的创新:第二个 ...
- python matplotlib生成图形
y=2x+3 import matplotlib.pyplot as plt#约定俗成的写法plt #首先定义两个函数(正弦&余弦) import numpy as np #plt.figur ...
- cache-control: max-age=1,s-maxage=1
cache-control: max-age=1,s-maxage=1