美文网首页iosiOS Developer程序员
今天上扛推位的是:"MLeaksFinder"

今天上扛推位的是:"MLeaksFinder"

作者: 是什么让我们拥抱 | 来源:发表于2017-07-20 22:24 被阅读744次

    首先交代一下背景:

    在 ARC 时代较常见的内存泄露是循环引用导致的,开发中也较容易被忽略.而苹果的 Instrument 操作起来既不简单又不粗暴,而且有些工具还查不出来这类问题.

    那么这篇文章适合你吗?

    1. 你需要一个简单粗暴的检测工具吗?
    2. 你是否对当前项目内存问题做过整体的跟踪监测?
    3. 你想要一个即时,精准,让你无拖延的解决问题的辅助工具吗?

    如果你都不需要,其实你也可以了解一下,因为他并不能耽误你几分钟时间,下面我们来看看如何

    使用及效果:

    第一步: 通过 pod 直接安装或下载拖入

    pod 'MLeaksFinder'

    https://github.com/Zepo/MLeaksFinder.git

    第二步: 给你的基类或任何一个类添加上这样一部分内容

    - (BOOL)willDealloc 
    {
        __weak id weakSelf = self;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [weakSelf assertNotDealloc];
        });
        return YES;
    }
    
    - (void)assertNotDealloc
    {
        NSAssert(NO, @“”);
    }
    

    第三步: 跑起来试试吧! 如果哪个类侧漏了,那么将会进入断言直接停止运行.

    中断言时,我们通过控制台如下提示可以看出 SearchResultBaseVC 这个类没有释放。

    debug.png

    那么如果我们找到了那个类,那么应该怎么确定问题呢?

    - (BOOL)willDealloc 
    {
        if(![super willDealloc]) {
            return NO;
        }
        // 可以这样 我们来看看是哪个对象没有被释放
        MLCheck(object);
        return YES;
    }
    

    从 MLeaksFinder 的使用方法可以看出,MLeaksFinder 具备以下优点:

    1.使用简单,不侵入业务逻辑代码,不用打开 Instrument
    2.不需要额外的操作,你只需开发你的业务逻辑,在你运行调试时就能帮你检测
    3.内存泄露发现及时,更改完代码后一运行即能发现(这点很重要,你马上就能意识到哪里写错了)
    4.精准,能准确地告诉你哪个对象没被释放

    当然,它也有一些缺点,比如一些不能被释放的(单例,一级界面,某些系统的私有 View,手势返回机制问题等),我们需要添加白名单.

    就这么简单了.

    这里非常感谢 WeRead团队博客 提供的内容,如您欲详细了解请移步 中文介绍

    相关文章

      网友评论

      • 崔可一:表达很到位:smile: 但是如果一个类中 在自己持有的对象中的block中 在外部使用weak修饰 在block又对weakself进行了strong修饰 这个block需要在异步进行一个耗时操作 比如需要10s 但是你在第5s的时候 退出页面 block没执行完 此时控制器不会被释放 过了3s 也就是第8s的时候 你进行了检测 但是此时控制器还是没有被释放 需要到第10s 任务执行完事 才能释放 这种情况是不是就检测失败了呢 其实内存是没有泄露的:flushed:
        iTruda:为了更严谨一点,在退出页面的时候,取消当前异步进行的这个耗时操作:smile:
        是什么让我们拥抱:@崔可一 那必须的 但是也有可能提示你释放延迟而不是泄漏

      本文标题:今天上扛推位的是:"MLeaksFinder"

      本文链接:https://www.haomeiwen.com/subject/hhzjkxtx.html