Objective c NSTimer不会失效

Objective c NSTimer不会失效,objective-c,nstimer,invalidation,Objective C,Nstimer,Invalidation,如何使计时器失效?我在没有使用self和许多其他方法的情况下尝试过它,但由于某种原因,当我按下按钮时,计时器不会失效。检查loadWeb:是否被多次调用。如果是,您将让旧计时器在没有引用的情况下运行,这样您就不能使它们无效。您应该有[self.checkForAdd invalidate]操作 当您使计时器无效时,如果您没有创建新的计时器,请设置self.checkForAdd=nil以确保不再尝试使用计时器(如果您这样做,某些操作将引发异常) 如果在任何时候您执行了self.checkForA

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

检查
loadWeb:
是否被多次调用。如果是,您将让旧计时器在没有引用的情况下运行,这样您就不能使它们无效。您应该有
[self.checkForAdd invalidate]操作

当您使计时器无效时,如果您没有创建新的计时器,请设置
self.checkForAdd=nil以确保不再尝试使用计时器(如果您这样做,某些操作将引发异常)


如果在任何时候您执行了
self.checkForAdd=nil
如果没有
使计时器无效
d,那么您将没有对它的引用,因此您将来将无法
使其无效。

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

-(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];
}

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

是否多次调用了
loadWeb:
方法?
self.checkForAdd
是否在其他地方使用?将NSLog放入loadWeb和button1中,并在button1中记录checkForAdd的值。您可能会发现,调用loadWeb的次数比button1多,或者button1为零。
if(!self.checkForAdd){
self.checkForAdd = [NSTimer scheduledTimerWithTimeInterval:0.4 
         target:self selector:@selector(checkForAddToCart:) userInfo:nil 
         repeats:YES];
}