iOS 内存泄露检查方法

1、关注项目中自己写的代码警告,并解决它。新版本的Xcode都是有提醒,是否有强引用的。
iOS 内存泄露检查方法_第1张图片
image.png
2、接下来看一下,项目常见的内存泄露,使用Xcode的Debug Memory Graph来查看内存图
iOS 内存泄露检查方法_第2张图片
image.png

视图层级

navigationController - ViewController - TestAViewController
2.0、在排查哪个控制器没有dealloc的话,优先检查某个控制器里面,是否有警告。
2.1、通知的Block实现
iOS 内存泄露检查方法_第3张图片
image.png
  • 1、第一次从ViewControllerpush到TestAViewController,并pop到ViewController的,打开内存图如下。
    • a、很明显能够看到,有一个Block在引用着TestAViewController。


      image.png
    • b、这时候,只需要复制Block块的内存,并在lldb中输入dis -s *(void**)(内存地址+16),就能反汇编查看方法调用栈。从控制台能够看出是initNoti方法,使用了这个Block。此方法参考:https://juejin.im/post/5d70655e518825618e67ad63

      iOS 内存泄露检查方法_第4张图片
      image.png

2.2、NSTimer没有销毁
iOS 内存泄露检查方法_第5张图片
image.png
  • 1、第一次从ViewControllerpush到TestAViewController,并pop到ViewController的,打开内存图如下。

    image.png

    • a、观察上图,是无法查看,TestAViewController为什么没有被释放。
  • 2、第二次从ViewControllerpush到TestAViewController,并pop到ViewController的,打开内存图如下。

    image.png

    • a、很明显是NSTimer在引用着TestAViewController。
2.3、delete没有使用weak(代码是别人写的,有时候别人一时手快写错了)
iOS 内存泄露检查方法_第6张图片
image.png
  • 1、第一次从ViewControllerpush到TestAViewController,并pop到ViewController的,打开内存图如下。
    image.png
    • a、在第一次就能非常清晰地查看WTViewdelete在引用着TestAViewController

你可能感兴趣的:(iOS 内存泄露检查方法)