dealloc 不执行

问题

在处理一个viewcontroller的时候,从viewcontroller A push到viewcontroller B,然后从viewcontroller B pop到viewcontroller A,理论上viewcontroller B会主动调用- (void)dealloc;这个方法,但是经过调试的时候,发现实际上并没有执行这个方法,也就是说viewcontroller B一直没被销毁。因为在viewcontroller B中使用了addObserver,所以如果viewcontroller B如果一直不被销毁的话,每次push过去后,addObserver会多次添加,造成会在执行的时候多次执行的问题。

分析原因

造成viewcontroller无法销毁的原因常见的有以下几点:

1、使用NSTimer,在pop后,没有对timer进行释放,导致控制器无法被销毁。

2、循环引用导致的控制器无法销毁,使用block,在block内对当前控制器进行强引用

3、delegate的强引用问题导致控制器无法销毁,一般我们在定义delegate的时候使用weak修饰

解决问题

在我的viewcontroller B 中使用了NSTimer以及block,NSTimer在viewWillDisappear中我已经进行了[timer invalidate]; timer = nil; 的操作,所以,排除了timer导致的无法销毁问题。检查block部分的使用情况,注释掉所有block部分的代码,然后运行发现程序执行了dealloc方法,定位到问题,就好解决了,逐步取消部分的block的注释,后来定位到的问题是在调用刷新控件的block中强引用self导致的当前控制器无法释放。一时的疏忽,导致被这个小问题折磨了一下。

注意:

以上问题中涉及到添加监听通知的使用,这就是dealloc如果不执行的话,我们无法移除监听,导致每次进入到viewcontroller B页面,监听都会被添加一次,会出很大问题的。所以在使用监听的时候一定要记得removeObserver。

你可能感兴趣的:(dealloc 不执行)