热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

IOS中POP控制器但是并没有被销毁

周六加班,真是个让人悲伤的故事。今天改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)

好了,这是今天在工作中碰到的问题,给大家分享下,如果有别的高见,请在下面留言。


推荐阅读
author-avatar
行者05965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有