这几天由于前台的ui没有给我图,所以有点闲,我一直在纠结内存优化的问题。
我昨天发现我的导航控制器在pop的时候居然没有走dealloc方法,我在leaks里面去运行,也没有发现内存泄漏的提示。但是作为一个合格的程序员一定不能允许出现这种情况。所以我开始 一步一步的查询。
归根结底,是因为当前控制器被某个对象强引用在控制器pop的时候count没有减为0,导致控制器的引用计数不为0,系统无法帮你释放这部分内存。
我控制器里面有通知,块比较是容易导致强引用,所以我就在这里面一句一句的去检查,结果在块里面发现了问题。我在块里面有一个地方居然调用self没有用他的弱引用形式,所以导致了self的count加一,最后直接导致控制器在pop的时候没有走dealloc这个方法。
总结了一下控制器被强引用不走dealloc的原因无非就是三中情况:
一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码。(我的就是因为这没有走dealloc)
二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。
三.控制器中的代理属性一定要是弱引用,不要强引用。