Fork me on GitHub

关闭页面却不走dealloc的问题

关闭页面却不走dealloc的问题

ARC 下可以重写 dealloc 方法并在 viewController 被释放后自动调用,重写该方法时不能显式调用[super dealloc],因为系统会自动帮你调用父类的dealloc方法。

控制器在被 pop 后移出栈后会被释放,但有些时候会发现控制器出栈的时候不会调用 dealloc 方法,归根结底,是因为当前控制器被某个对象强引用了,控制器的引用计数不为0,系统无法帮你释放这部分内存。原因大致有以下几点:

控制器中NSTimer没有被销毁

当 viewController 中存在 NSTimer 时,需要特别注意,当调用

1
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:)  userInfo:nil repeats:YES]

时,因为 target:self ,也就是引用了当前viewController,导致控制器的引用计数加1,如果没有将这个NSTimer 销毁,它将一直保留该 viewController,无法释放,也就不会调用 dealloc 方法。所以,需要在 viewWillDisappear 之前需要把控制器用到的NSTimer销毁。

1
2
[timer invalidate]; // 销毁timer
timer = nil; // 置nil

viewController中的代理不是weak属性

例如@property (nonatomic, weak) id delegate;代理要使用弱引用,因为自定义控件是加载在视图控制器中的,视图控制器 view 对自定义控件是强引用,如果代理属性设置为 strong,则意味着 delegate 对视图控制器也进行了强引用,会造成循环引用。导致控制器无法被释放,最终导致内存泄漏。

viewController中的Block循环引用

在 ARC 下,block 会把它里面的所有对象强引用,包括当前控制器 self,因此有可能会出现循环引用的问题。比如 viewController 中有个 block 属性,在 block 中又强引用了self或者其他成员变量,那么这个 viewController 与自己的 block 属性就形成循环引用,导致 viewController 无法释放。

-------------本文结束感谢您的阅读-------------

本文作者:乔羽 / FightingJoey

发布时间:2016年05月28日 - 21:52

最后更新:2018年09月27日 - 10:10

原始链接:https://fightingjoey.github.io/2016/05/28/开发/关闭页面却不走dealloc的问题/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!