美文网首页
NSTimer销毁时遇到的坑

NSTimer销毁时遇到的坑

作者: multisim10 | 来源:发表于2018-05-06 14:21 被阅读0次

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

    image.png

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

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

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

    相关文章

      网友评论

          本文标题:NSTimer销毁时遇到的坑

          本文链接:https://www.haomeiwen.com/subject/zxkurftx.html