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

利用两周时间,稍微研究了 微信开源的 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 ::

  1. #import "ViewController.h"
  2. #import "FirstController.h"
  3.  
  4. @interface ViewController ()
  5.  
  6. @end
  7.  
  8. @implementation ViewController
  9.  
  10. - (void)viewDidLoad {
  11. [super viewDidLoad];
  12.  
  13. self.navigationItem.title = @"vc";
  14.  
  15. [self creatButton];
  16.  
  17. }
  18.  
  19. - (void)didReceiveMemoryWarning {
  20. [super didReceiveMemoryWarning];
  21. }
  22.  
  23. -(void)creatButton{
  24.  
  25. UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
  26.  
  27. [self.view addSubview:button];
  28.  
  29. button.center = self.view.center;
  30.  
  31. [button setTitle:@"下一页" forState:UIControlStateNormal];
  32.  
  33. button.backgroundColor = [UIColor yellowColor];
  34.  
  35. [button addTarget:self action:@selector(didButtonClick:) forControlEvents:UIControlEventTouchUpInside];
  36.  
  37. }
  38.  
  39. -(void)didButtonClick:(UIButton*)btn{
  40.  
  41. NSLog(@"vc btn Click");
  42.  
  43. [self.navigationController pushViewController:[FirstController new] animated:true];
  44. }

新建 FirstController :

  1. #import "FirstController.h"
  2. #import "TestView.h"
  3.  
  4. @interface FirstController ()
  5.  
  6. @property (nonatomic,strong)TestView *testView;
  7.  
  8. @end
  9.  
  10. @implementation FirstController
  11.  
  12. - (void)viewDidLoad {
  13. [super viewDidLoad];
  14.  
  15. self.navigationItem.title = @"first vc";
  16.  
  17. self.view.backgroundColor = [UIColor whiteColor];
  18.  
  19. [self addTestView];
  20. }
  21.  
  22. - (void)didReceiveMemoryWarning {
  23. [super didReceiveMemoryWarning];
  24.  
  25. }
  26.  
  27. -(void)addTestView{
  28.  
  29. self.testView = [[TestView alloc]initWithFrame:CGRectMake(0, 0, 200, 30)];
  30.  
  31. self.testView.vc = self;
  32.  
  33. [self.view addSubview:self.testView];
  34.  
  35. self.testView.center = self.view.center;
  36. }
    @end

新建 TestView :

TestView .h

  1. #import <UIKit/UIKit.h>
  2. #import "FirstController.h"
  3.  
  4. @interface TestView : UIView
  5.  
  6. @property (nonatomic,strong)FirstController *vc;// 把这个属性 换成 strong 属性 故意造成 泄露
  7.  
  8. @end

TestView .m

  1. #import "TestView.h"
  2.  
  3. @implementation TestView
  4.  
  5. - (instancetype)initWithFrame:(CGRect)frame
  6. {
  7. self = [super initWithFrame:frame];
  8. if (self) {
  9.  
  10. [self prepareUI];
  11. }
  12. return self;
  13. }
  14.  
  15. -(void)prepareUI{
  16.  
  17. self.backgroundColor = [UIColor redColor];
  18. }
  19.  
  20. @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:::

  1. #ifdef MEMORY_LEAKS_FINDER_ENABLED
  2.  
  3. //_INTERNAL_MLF_ENABLED 宏用来控制 MLLeaksFinder库
  4. //什么时候开启检测,可以自定义这个时机,默认则是在DEBUG模式下会启动,RELEASE模式下不启动
  5. //它是通过预编译来实现的

  6. #define _INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED
  7.  
  8. #else
  9.  
  10. #define _INTERNAL_MLF_ENABLED DEBUG
  11.  
  12. #endif
  13.  
  14.  
  15. //_INTERNAL_MLF_RC_ENABLED 宏用来控制 是否开启循环引用的检测

  16. #ifdef MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED
  17.  
  18. #define _INTERNAL_MLF_RC_ENABLED MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED
  19.  
  20. //COCOAPODS 因为MLLeaksFinder引用了第三库用来检查循环引用,所以必须是当前项目中使用了COCOAP
  21. //ODS,才能使用这个功能。
  22. #elif COCOAPODS
  23.  
  24. #define _INTERNAL_MLF_RC_ENABLED COCOAPODS
  25.  
  26. #endif

2.2 . 添加cocopod ,然后 Pod 添加 FBRetainCycleDetector;

注释 这两段代码 == 》同时开启 MLeakfinder 检测 和 retainCycle 检测

  1. //#define MEMORY_LEAKS_FINDER_ENABLED 0
  2.  
  3. #ifdef MEMORY_LEAKS_FINDER_ENABLED
  4.  
  5. #define _INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED
  6.  
  7. #else
  8.  
  9. #define _INTERNAL_MLF_ENABLED DEBUG
  10.  
  11. #endif
  12.  
  13. //#define MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED 0
  14.  
  15. #ifdef MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED
  16.  
  17. #define _INTERNAL_MLF_RC_ENABLED MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED
  18.  
  19. #elif COCOAPODS
  20.  
  21. #define _INTERNAL_MLF_RC_ENABLED COCOAPODS
  22.  
  23. #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. YAML_11 when条件判断

    当系统负载超过0.7时,则关掉httpd ansible]# vim when.yml --- - hosts: cache   remote_user: root   tasks:     - sh ...

  2. shell命令的原理

    https://blog.csdn.net/m0_37925202/article/details/80258974 https://blog.csdn.net/a15929748502/articl ...

  3. copy()函数技术推演

    /*** str_copy.c ***/ #include<stdio.h> void copy_str21(char *from, char *to) { for(; *from != ...

  4. [ThinkPHP6.*安装 (草稿先发布,再维护)

    ThinkPHP6.0的安装,官方文档中有详细的说明,不过在安装之前,大家还是要做一些准备的,就是PHP本地开发环境 的搭建. 官方手册地址:https://www.kancloud.cn/manua ...

  5. LayuiAdmin 单页版关闭当前页面tab的方式-图文

    需要关闭的时候 调用 parent.layui.admin.events.closeThisTabs() 即可执行当前页面的关闭 $.post("/index.php/WebAdmin/Wx ...

  6. Linux文件与文件夹的权限问题

    0x01 修改文件可读写属性的方法 例如:把index.htm 文件修改为可写可读可执行: chmod 777 index.htm 要修改目录下所有文件属性可写可读可执行: chmod 777 *.* ...

  7. Vue编程基础

    一.依赖环境搭建: 添加镜像 # 安装好node.js后,使用淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 项 ...

  8. 2019SDN课程阅读作业(2)

    1.过去20年中可编程网络的发展可以分为几个阶段?每个阶段的贡献是什么? 分为三个阶段,第一个阶段是主动网络(从20世纪90年代中期到21世纪初),它在网络中引入了可编程功能,以实现更大的创新:第二个 ...

  9. python matplotlib生成图形

    y=2x+3 import matplotlib.pyplot as plt#约定俗成的写法plt #首先定义两个函数(正弦&余弦) import numpy as np #plt.figur ...

  10. cache-control: max-age=1,s-maxage=1

    cache-control: max-age=1,s-maxage=1