NSTimer是iOS常用的定时器,但是销毁却是一件麻烦的事情。
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(showTimer:) userInfo:nil repeats:YES];
这段代码是常用的创建NSTimer的方式,并把timer添加到Runloop中,但是如何销毁它呢?网上给的解决方案是如下几种
方案一
- (void)dealloc {
if ([self.timer isValid]) {
[self.timer invalidate];
self.timer = nil;
}
}
方案二
//页面将要进入前台,开启定时器
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//开启定时器
[self.timer setFireDate:[NSDate distantPast]];
}
//页面消失,进入后台不显示该页面,关闭定时器
-(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
//关闭定时器
[self.timer setFireDate:[NSDate distantFuture]];
}
方案三
方案一和方案二组合
但是亲测三种方案均不能销毁timer,原因如下图所示
VC强引用timer,timer的target强引用vc,造成循环引用,因此不能释放
那么应该如何销毁timer呢?打破循环引用就可以,即timer的target不要是self即可。有兴趣的读者可以试试看。