今天改BUG的时候 发现了一个问题,我的控制器注册了几个监听方法。当我pop掉这个控制器的时候,看似是从栈里移除掉了,然而当广播发来的时候,依旧响应了监听方法,这就很尴尬了。于是我跟踪了一下代码,发现当我pop之后根本没有走到deinit方法(swift) 也就是OC中的dealloc 方法。好吧,今天我就总结一下 当碰到这种情况的时候如何去 找到问题,或者说 在我们平时写代码的时候 如何避免这些问题发生。
归根结底,这种情况的发生就是当前控制器被某个对象强引用,在控制器pop 的时候count没有减为0,引用计数器不为0 系统就不会为你释放这部分内存。
我总结了一个,控制器没有被销毁无非就以下三种情况:
1.block块使用不当。因为blocak会对方法中的变量自动retain一次。所以,大家先检查以下自己控制器中的blocak代码。看下面的图应该能更好理解
2.计时器NSTimer没有被销毁,记得在viewWillDisappear之前把控制器用到的计时器销毁。 (不管是重复性的timer还是一次性的timer都会对它的方法的接收者进行retain,这两种timer的区别在于“一次性的timer在完成调用以后会自动将自己invalidate,而重复的timer则将永生,直到你显式的invalidate它为止)
3.控制器中的代理一定要用弱引用,不要用强引用。其实和上图没什么区别,A引用B,B引用了自己的代理,代理又强应用了A 导致循环引用。所以代理要用weak。
网友评论