controller dealloc不执行问题

1,VC中使用了NSTimer计时器,使用计时器当VC进行push ——pop之后,如果NSTimer对象没有进行销毁,就会造成内存泄漏,也就是引用了当前VC,导致控制器的引用计数加1,如果没有将这个NSTimer 销毁,它将一直保留该VC,无法释放,也就不会调用dealloc方法。所以,需要在viewWillDisappear之前需要把控制器用到的NSTimer销毁。

销毁方法:[timer invalidate]; // 销毁timer
timer = nil; // 置nil
或者在GCD中的销毁方法:
dispatch_source_cancel(_timer);

2,Block代码块中使用了强引用self,容易造成循环引用,对象长时间不能释放而引起的。

具体可以:

#define WS(weakSelf)  __weak __typeof(self)weakSelf = self;

使用弱引用weakSelf来代替self,
或者项目在回调代码块中调用内部成员变量及属性时的self.name或者_name都会引起循环引用,具体方法同上。

3,就是可能在项目VC中采用的代理方法属性的代理不是weak属性具体的方法如下:

:@property (nonatomic, weak) id delegate;

也就是网上常说的三种情况,我今天犯了第2种,但是就在思考一个基础问题什么样的block是可以用self的。

我没太深研究,就我测试来看有两种情况是不用的:

1、像动画这种:

当 block 本身不被 self 持有,而被别的对象持有,同时不产生循环引用的时候,就不需要使用 weak self 了。最常见的代码就是 UIView 的动画代码,我们在使用 UIView 的 animateWithDuration:animations 方法 做动画的时候,并不需要使用 weak self,因为引用持有关系是:

UIView 的某个负责动画的对象持有了 block
block 持有了 self
因为 self 并不持有 block,所以就没有循环引用产生,因为就不需要使用 weak self 了。

[UIView animateWithDuration:0.2 animations:^{
    self.alpha = 1;
}];
2、像有dispatch_get_main_queue()这种的block,本来就是在主线程,只有放弃占用才会往下走。不存在循环引用的问题。

而这种

__weak typeof(self) weakSelf = self;
[self doSomeBlockJob:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        ...
    }
}];

就是本身占有。

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