作者:行者05965 | 来源:互联网 | 2023-05-17 19:05
周六加班,真是个让人悲伤的故事。今天改BUG的时候发现了一个问题,我的控制器注册了几个监听方法。当我pop掉这个控制器的时候,看似是从栈里移除掉了,然而当广播发来的时候,依旧响应了监听方法,这就很尴
周六加班,真是个让人悲伤的故事。今天改BUG的时候 发现了一个问题,我的控制器注册了几个监听方法。当我pop掉这个控制器的时候,看似是从栈里移除掉了,然而当广播发来的时候,依旧响应了监听方法,这就很尴尬了。于是我跟踪了一下代码,发现当我pop之后根本没有走到deinit方法(swift) 也就是OC中的dealloc 方法。好吧,今天我就总结一下 当碰到这种情况的时候如何去 找到问题,或者说 在我们平时写代码的时候 如何避免这些问题发生。
归根结底,这种情况的发生就是当前控制器被某个对象强引用,在控制器pop 的时候count没有减为0,引用计数器不为0 系统就不会为你释放这部分内存。
我总结了一个,控制器没有被销毁无非就以下三种情况:
1.block块使用不当。因为blocak会对方法中的变量自动retain一次。所以,大家先检查以下自己控制器中的blocak代码。具体怎么写就不说了,weak。
2.计时器NSTimer没有被销毁,记得在viewWillDisappear之前把控制器用到的计时器销毁。 (不管是重复性的timer还是一次性的timer都会对它的方法的接收者进行retain,这两种timer的区别在于“一次性的timer在完成调用以后会自动将自己invalidate,而重复的timer则将永生,直到你显式的invalidate它为止)
3.控制器中的代理一定要用弱引用,不要用强引用。 (这点应该是出现最少的情况,相信大家最初学习IOS代理这块的时候,已经被告知“先就这么写,不要管为什么”,于是基本上大家都是写成weak)
好了,这是今天在工作中碰到的问题,给大家分享下,如果有别的高见,请在下面留言。