我一直在盯着我的代码几个小时,所以我想我可能会尝试来这里寻找一些新鲜的眼睛。我需要创建一个计时器,所以我使用下面的代码来做到这一点。第一行是我创建计时器的地方,第二行是我的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];
}
澄清我的代码:事件的顺序从我的第一个代码块(创建计时器)开始。然后调用我的第二个代码块(使计时器无效)。最后我的第三个代码块被调用(制作一个新的计时器)。
我知道它是双递增的,因为当我运行代码时,我可以直观地看到定时器双递增。
答案 0 :(得分:2)
调用两次创建计时器的代码非常容易。当你这样做时,你实际上有两个同时运行的计时器。每一个都会递减你的值,所以它会每秒减少两次。
例如,如果您在viewWillAppear方法中创建计时器,则需要在viewWillDisappear方法中使其无效,以确保只有一个正在运行。
同样的方法适用于您创建计时器的其他情况。您需要确保平衡每个创建计时器的调用与使该计时器无效的调用。
如果使用scheduledTimer ...方法之一,则可以将弱指针保存到计时器。只要它运行,运行循环将保留它。当您使其无效时,系统运行循环将释放它并将其解除分配。当发生这种情况时,您的弱指针会变为零,因此您甚至不必测试它以查看它是否在您的viewWillAppear方法中有效/无。
编辑:
您需要检测代码。在你的infoClick方法中,变量_timer
是否为零?这是什么地址?
- (void) decrementTime: (NSTimer *) timer
{
NSLog(@"In method decrementTime, timer = %X", (unsigned long) timer)
self.timeLeft--;
}
然后查看你的日志,看看你的convmentTime方法是否是从2个不同的计时器调用的(我敢打赌这是金钱。)
您可能还想将从调用中获得的计时器的地址记录到scheduledTimerWithTimeInterval ...