NSTimer不会失效

时间:2014-01-12 14:48:08

标签: objective-c nstimer invalidation

-(IBAction) loadWeb: (id) sender {

     [_webView loadRequest:nsrequest2];
     _webView1.hidden = YES;
     _webView.hidden = NO;

     self.checkForAdd = [NSTimer scheduledTimerWithTimeInterval:0.4 
         target:self selector:@selector(checkForAddToCart:) userInfo:nil 
         repeats:YES];
}

-(IBAction)button1:(id)sender {
    [self.checkForAdd invalidate];
}

我如何使timer无效?我在没有self和许多其他方式的情况下尝试过,但出于某种原因,当我按下按钮时,计时器不会失效。

2 个答案:

答案 0 :(得分:0)

检查是否多次调用loadWeb:。如果是,您将使旧的计时器在没有引用它们的情况下运行,因此您无法使它们失效。在创建新计时器之前,您应该[self.checkForAdd invalidate];

当您执行invalidate计时器时,如果您没有创建新计时器,请设置self.checkForAdd = nil;以确保您不会再次尝试使用计时器(某些操作会抛出一个如果你这样做则例外。)

如果您在self.checkForAdd = nil;没有invalidate d计时器的情况下执行invalidate,那么您将无法参考该计时器,因此您无法{{1}}将来

答案 1 :(得分:0)

根据您的代码,按钮会触发loadWeb。因此,每当按下按钮时,您将创建新的计时器。最好在其他地方创建计时器,比如在init中创建,或者在viewDidLoad方法中创建计时器,因为如果你在这里创建它,你必须确保你不是一次又一次地创建计时器。您可以通过执行if检查

来执行此操作
if(!self.checkForAdd){
self.checkForAdd = [NSTimer scheduledTimerWithTimeInterval:0.4 
         target:self selector:@selector(checkForAddToCart:) userInfo:nil 
         repeats:YES];
}

现在它在按钮点击上创建新计时器,而前一个计时器没有参考。