1、关注项目中自己写的代码警告,并解决它。新版本的Xcode都是有提醒,是否有强引用的。
2、接下来看一下,项目常见的内存泄露,使用Xcode的Debug Memory Graph
来查看内存图
视图层级
navigationController - ViewController - TestAViewController
2.0、在排查哪个控制器没有dealloc
的话,优先检查某个控制器里面,是否有警告。
2.1、通知的Block实现
- 1、第一次从
ViewController
push到TestAViewController
,并pop到ViewController
的,打开内存图如下。-
a、很明显能够看到,有一个Block在引用着TestAViewController。
-
b、这时候,只需要复制Block块的内存,并在lldb中输入
dis -s *(void**)(内存地址+16)
,就能反汇编查看方法调用栈。从控制台能够看出是initNoti
方法,使用了这个Block。此方法参考:https://juejin.im/post/5d70655e518825618e67ad63
-
2.2、NSTimer没有销毁
-
1、第一次从
ViewController
push到TestAViewController
,并pop到ViewController
的,打开内存图如下。
- a、观察上图,是无法查看,TestAViewController为什么没有被释放。
-
2、第二次从
ViewController
push到TestAViewController
,并pop到ViewController
的,打开内存图如下。
- a、很明显是NSTimer在引用着TestAViewController。
2.3、delete没有使用weak(代码是别人写的,有时候别人一时手快写错了)
- 1、第一次从
ViewController
push到TestAViewController
,并pop到ViewController
的,打开内存图如下。
- a、在第一次就能非常清晰地查看
WTView
的delete
在引用着TestAViewController
- a、在第一次就能非常清晰地查看