美文网首页
iOS 开发中如何优雅地监控控制器泄露

iOS 开发中如何优雅地监控控制器泄露

作者: liangdahong | 来源:发表于2020-05-24 01:09 被阅读0次

    AMLeaksFinder

    是一款用于自动检测项目中【控制器内存泄漏】的工具,只需要把 Sources 路径下的文件拖入项目即可,在上线时请务必移除框架,如果你感兴趣可以一起聊聊。

    AMLeaksFinder 实现原理分析

    原理介绍

    控制器通常从创建显示释放要经过一系列的生命周期方法,大概如下:

    - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil;
    - (nullable instancetype)initWithCoder:(NSCoder *)coder;
    - (void)loadView;
    - (void)loadViewIfNeeded
    - (void)viewWillUnload
    - (void)viewDidUnload
    - (void)viewDidLoad;
    - (void)viewWillAppear:(BOOL)animated;
    - (void)viewDidAppear:(BOOL)animated;
    - (void)viewWillDisappear:(BOOL)animated;
    - (void)viewDidDisappear:(BOOL)animated;
    - (void)viewWillLayoutSubviews
    - (void)viewDidLayoutSubviews
    - (void)dealloc{}
    

    一般情况,如果控制器没有内存泄漏,一般会经过 viewDidLoaddealloc 方法。

    那么我们就可以从上面的 2 个方法入手,如果一个控制器经过了 viewDidLoad, 同时在应该释放的时候一直没有 dealloc,那么基本可以确定控制器泄漏了【是基本确定,当然有特殊情况,如:常驻控制器,提供忽略类似控制器的功能】,那什么时候是控制器应该释放的时候呢 ?

    触发了如下方法的时候可以基本确定相关控制器需要释放:

    • UIViewControllerdismissViewControllerAnimated:completion: 操作

    • UINavigationController 触发了 popViewControllerAnimated:

    • UINavigationController 触发了 popToViewController:animated:

    • UINavigationController 触发了 popToRootViewControllerAnimated:

    • UINavigationController 触发了 popViewControllerAnimated:

    • UINavigationController 触发了 setViewControllers:

    • UINavigationController 触发了 setViewControllers:animated:

    • UITabBarController 触发了 setViewControllers:

    • UITabBarController 触发了 setViewControllers:animated:

    • UIPageViewController 触发了 setViewControllers:direction:animated:completion:

    • UISplitViewController 触发了 setViewControllers:

    • ...等。

    我们可以从上面的分析出发,在 viewDidLoad 的时候记录控制器,然后在控制器 dealloc 的时候清除,在需要释放的时候把相关控制器标记为将要释放,然后把相关的统计数据呈现出来即可。

    AMLeaksFinder 的处理逻辑

    • hook 控制器的 viewDidLoad 方法,同时做相关的逻辑操作,注意不要强引用。

      image
      image
      image
    • hook UINavigationControllersetViewControllers: 和相关 pop 方法,把相关的控制器设置为将要释放【 控制器A需要释放,那么控制器 A 包括它的子子孙孙控制器全部需要释放 】。

    image
    image
    image
    • 在自定义专门监控控制器释放的 classdealloc 里处理相关逻辑,代码如下:
    image
    • UI 实时统计出当前统计的控制器数据即可。
    • 其中用到了 2 个自定义类,其中 AMMemoryLeakDeallocModel 主要是为了监控控制器的释放,AMMemoryLeakModel 是为了统计数据。

    参考

    相关文章

      网友评论

          本文标题:iOS 开发中如何优雅地监控控制器泄露

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