NSTimer销毁时遇到的坑

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,原因如下图所示

NSTimer销毁时遇到的坑_第1张图片
image.png

VC强引用timer,timer的target强引用vc,造成循环引用,因此不能释放

那么应该如何销毁timer呢?打破循环引用就可以,即timer的target不要是self即可。有兴趣的读者可以试试看。

图片引用自https://www.jianshu.com/p/d8fdaf04cad6

你可能感兴趣的:(NSTimer销毁时遇到的坑)