ViewController 在POP时不走dealloc方法的原因

今天上午在检查上周用到的通知方法。在销毁通知的时候,发现没有走dealloc方法。

于是赶紧检查了一下代码,发现有一个block里用的是_pointRecordTable。当时写的时候还真没注意。这里的_pointRecordTable相当于self.pointRecordTable。block循环引用了。改用weak修饰后再跑一遍就好了。大家写代码的时候一定要注意啊,要细心= =

所以在这里顺便整理一下在ViewController 里POP后不走dealloc方法的原因:

1、控制器中NSTimer没有被销毁

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

[NSTimerscheduledTimerWithTimeInterval:1.0target:selfselector:@selector(updateTime:)  userInfo:nilrepeats:YES]

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

[timer invalidate];//销毁    timertimer =nil;//值nil

2、viewController中的代理不是weak属性

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

3、viewController中block的循环引用

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

其实一般出现不走dealloc的原因大多都是处在block循环引用上。大家注意这一点就好了。

贴一个我关于__weak block 的宏定义:

#define WEAKSELF typeof(self) __weak weakSelf = self;

你可能感兴趣的:(ViewController 在POP时不走dealloc方法的原因)