iOS 利用runtime自定义内存检测工具(UIViewController)

UIViewController是我们在iOS开发中用的最频繁的类,是一个iOS app界面骨架,在mvc的框架下,v就是指UIViewController,几乎所有的业务逻辑都在这里面完成,因此在这种模式下,UIViewController的代码量比较大,进而出现内存泄漏的风险也比较大,因此很有必要在开发的过程中,对其进内存泄漏的检测。

内存泄漏的工具有很多,Xcode就自带了集中方式,例如analyze,instrument中的leaks,还有第三方工具MLeakFinder等等。在检测的时候,虽然不是100%能够检测出来,但是大部分都是没问题的,本文就是在研究MLeakFinder第三方库的基础上,根据据自己的理解,自己写的一个关于UIViewController的自定义内存检测工具。

原理分析:

1、dispatch_after这个是GCD提供的一个延时处理事物的方式,只需要将延时的任务放到block中,设置好时长即可,而我们将一个弱引用对象放到block中,不会影响对象的释放,就有如下的代码:

iOS 利用runtime自定义内存检测工具(UIViewController)_第1张图片
延时任务

通常情况下,UIViewController的释放都是在被UINavigationController pop或者presenter出来后自身dismiss这两个时机后,而且一定会走viewDidDisappear这个方法,但是不是所有的viewWillDisappear都是这两个时机,所以需要区分标记。

iOS 利用runtime自定义内存检测工具(UIViewController)_第2张图片
标记区分

另外,为了做到不侵入式,需要用到分类,通过runtime动态交换这些时机方法。

代码实现:

UINavigationController(HxwLeak)时机方式扑捉并处理:

扑捉释放时机


UIViewController(HxwLeak)  dismiss时机及处理延时任务

iOS 利用runtime自定义内存检测工具(UIViewController)_第3张图片
dismiss时机及处理延时任务


以上就是这些,具体见demo。

你可能感兴趣的:(iOS 利用runtime自定义内存检测工具(UIViewController))