iOS 内存泄漏之循环应用

iOS中的内存泄漏可以分为两种:

  1. 被泄漏的内存已经没有对象对其持有,但是没有正常释放,主要是OC对象与C语言转换造成的;
  2. 被泄漏的对象没有释放是因为互相持有造成的,造成的主要场景有block、delegate、Timer、互相为对方的成员变量。

instruments是xcode中很强大的一个工具,虽然Leak中有Cycles&Roots来检测循环引用,但是经过手动写了个循环引用测试了一下,并没有起作用。另外可以使用Allocations中的Generations中的Mark Generation来获取当前内存中的所有的对象,然后通过在不同时刻进行Mark来进行对应,找出未释放的对象。但是此方法要对每个场景进行手动的测试,界面的数据显示也比较乱,可操作性比较低。

MLeaksFinder

腾讯的开源框架#MLeaksFinder可是非常简单的实现检测循环引用。集成非常简单,只需要将MLeaksFinder集成到项目中,不需要添加任何代码。就可以自动在 App 运行过程检测到内存泄露的对象并立即弹窗提醒。提示的时候会通过viewController和View的视图层次结构进行提示。比如ViewController-View-tableView-tableViewCell-contentView-subView。
虽然MLeaksFinder可以非常简单的检测出哪个对象出现了内存泄漏。但是没法定位到该对象什么原因引起的循环引用。此时可以配置xocode中的Debug Memory Graph来进行调试。

iOS 内存泄漏之循环应用_第1张图片
image.png

点击Debug Memory Graph后,就可以在左侧看到此时内存中所有的对象列表,非常清晰
iOS 内存泄漏之循环应用_第2张图片
image.png

我们通过MLeaksFinder找到内存泄漏的对象后,在此列表中搜索找到该对象,然后选中该对象,就可以看到该对象的和其他对象的一个关系视图,就可以轻易的找到那些对象引用了该对象,然后在去代码中定位到引起循环引用的原因。
iOS 内存泄漏之循环应用_第3张图片
image.png

你可能感兴趣的:(iOS 内存泄漏之循环应用)