NSTimer定时器的销毁

定时器的销毁

1、如果是在VC中创建的定时器,需要在dealloc方法中销毁

    - (void)dealloc{
          [_timer invalidate];
          _timer = nil;
    }

2、有时会自定义View,并且在这个View中创建定时器,这时直接在dealloc中销毁是无效的,

     _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(startCount)                          
       userInfo:nil repeats:YES];

因为创建定时器的时候,已经对self进行了强引用,所以self的dealloc不会调用的。
解决方法是在View的willMoveToSuperview方法中销毁

    - (void)willMoveToSuperview:(UIView *)newSuperview {
        [super willMoveToSuperview:newSuperview];
        if (! newSuperview && self.timer) {
            // 销毁定时器
            [self.timer invalidate];
            self.timer = nil;
        }
    }

补充:用递归代替定时器

(每间隔一秒钟就执行一次这个方法,如果需要停止,只要进入方法时return掉,就可以了,也不需要考虑循环引用的问题)

    - (void)countTime:(UIButton *)btn{
        NSLog(@"%s count = %ld",__FUNCTION__,count);

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
             if (count <= 1) {//恢复起始状态,准备重新倒计时
                count = 120;
                return ;
            }else{
                [self countTime:btn];    //递归
            }
        });
    }

你可能感兴趣的:(NSTimer定时器的销毁)