pop掉之后你的控制器真的被销毁了吗?

今天改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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 5,307评论 1 27
  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 4,390评论 0 4
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 9,680评论 2 19
  • 1. 单例写法 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 一般情况下, 如果一个...
    sellse阅读 4,650评论 0 1
  • 不管是在工作中,还是在生活中,我们的身边,总有那么一两个如同“圣母”一样的“可爱的人”他们认为“要让别人喜欢自己、...
    青鸟的天空727阅读 2,958评论 2 4

友情链接更多精彩内容