为什么我的NSTimer双倍减少我的计时器?

时间:2014-12-09 00:47:40

标签: ios objective-c timer

我一直在盯着我的代码几个小时,所以我想我可能会尝试来这里寻找一些新鲜的眼睛。我需要创建一个计时器,所以我使用下面的代码来做到这一点。第一行是我创建计时器的地方,第二行是我的decrementTime方法。对于IOS应用程序,这是在Objective C中。这是我第一次在StackOverflow上发帖(我经常找到我要找的答案),所以请告诉我任何我不遵循的不成文规则。

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

- (void)decrementTime{
       self.timeLeft--;
}

我在这里添加我使第一个计时器无效的地方

-(IBAction)infoClick:(id)sender{
       [_timer invalidate];   
}

然后这是信息消息,我在其中创建另一个计时器

- (void)hideInfoMessage {  
     _secondTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(decrementTime) userInfo:nil repeats:YES];
}

澄清我的代码:事件的顺序从我的第一个代码块(创建计时器)开始。然后调用我的第二个代码块(使计时器无效)。最后我的第三个代码块被调用(制作一个新的计时器)。

我知道它是双递增的,因为当我运行代码时,我可以直观地看到定时器双递增。

1 个答案:

答案 0 :(得分:2)

调用两次创建计时器的代码非常容易。当你这样做时,你实际上有两个同时运行的计时器。每一个都会递减你的值,所以它会每秒减少两次。

例如,如果您在viewWillAppear方法中创建计时器,则需要在viewWillDisappear方法中使其无效,以确保只有一个正在运行。

同样的方法适用于您创建计时器的其他情况。您需要确保平衡每个创建计时器的调用与使该计时器无效的调用。

如果使用scheduledTimer ...方法之一,则可以将弱指针保存到计时器。只要它运行,运行循环将保留它。当您使其无效时,系统运行循环将释放它并将其解除分配。当发生这种情况时,您的弱指针会变为零,因此您甚至不必测试它以查看它是否在您的viewWillAppear方法中有效/无。

编辑:

您需要检测代码。在你的infoClick方法中,变量_timer是否为零?这是什么地址?

BTW,NSTimer的目标应该是一个采用单个参数的方法,即定时器本身。您应该将decrementTime方法更改为:

- (void) decrementTime: (NSTimer *) timer
{
  NSLog(@"In method decrementTime, timer = %X", (unsigned long) timer)
  self.timeLeft--;
}

然后查看你的日志,看看你的convmentTime方法是否是从2个不同的计时器调用的(我敢打赌这是金钱。)

您可能还想将从调用中获得的计时器的地址记录到scheduledTimerWithTimeInterval ...