Ios 为什么我的NSTimer会加倍减少我的计时器?

Ios 为什么我的NSTimer会加倍减少我的计时器?,ios,objective-c,timer,Ios,Objective C,Timer,我已经盯着我的代码看了好几个小时了,所以我想我可以试着到这里来看看。我需要创建一个计时器,所以我使用下面的代码来实现。第一行是我创建计时器的地方,第二部分是我的递减时间方法。这是IOS应用程序的目标C。这是我第一次在StackOverflow上发帖(我通常会找到我想要的答案),所以请让我知道我没有遵守的任何不成文规则 _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(decremen

我已经盯着我的代码看了好几个小时了,所以我想我可以试着到这里来看看。我需要创建一个计时器,所以我使用下面的代码来实现。第一行是我创建计时器的地方,第二部分是我的递减时间方法。这是IOS应用程序的目标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];
}
关于我的代码的说明:事件的顺序从我的第一个代码块(创建计时器)开始。然后调用第二个代码块(使计时器无效)。最后,我的第三个代码块被调用(创建一个新的计时器)


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

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

例如,如果您在ViewWillExample方法中创建了计时器,那么您需要在ViewWillEnglishe方法中使其无效,以便确保只有一个计时器正在运行

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

如果您使用一个scheduledTimer。。。方法,则可以保存指向计时器的弱指针。运行循环将保留它,直到它运行为止。当您使它无效时,系统运行循环将释放它,并将释放它。当这种情况发生时,您的弱指针将被置零,因此您甚至不必测试它,以查看它在viewWillExample方法中是否有效/nil

编辑:

你需要插入你的代码。在infoClick方法中,变量
\u timer
nil吗?它的地址是什么

顺便说一句,NSTimer的目标应该是一个接受单个参数的方法,即计时器本身。您应该将递减时间方法更改为如下所示:

- (void) decrementTime: (NSTimer *) timer
{
  NSLog(@"In method decrementTime, timer = %X", (unsigned long) timer)
  self.timeLeft--;
}
然后看看你的日志,看看你的递减时间方法是否是从两个不同的计时器调用的(我敢打赌是这样的)


您可能还想记录从scheduledTimerWithTimeInterval通话中返回的计时器地址…

FWIW,这里没有“未成文”的规则-查看常见问题解答,了解您需要了解的一切(以及更多)。幸运的是,你知道它是双重递减的吗?正在尝试添加
NSLog(@“%s”,函数)
到您的
递减时间
,这样您就可以看到每次根据更新代码调用它时,您都在创建两个不同的计时器,并且都指向同一个选择器。这就可以解释双倍递减的原因了。@rmaddy对不起,我还是有点困惑。当我使第一个计时器失效时,它不再存在了吗?回答得好。此外,OP在定时器上没有显示终端条件。与其减少剩余时间,不如计算未来计时器应该结束的时间,保存该时间,并将其与计时器触发时的当前时间进行比较。是的,我认为这也是一个问题。但我唯一一次创建另一个计时器是在暂停游戏时。我使第一个计时器无效,并创建一个新计时器。@SteveCohen为了确保这一点,请将使_timer无效的行放在分配它的行之前。明确说明问题的两端,并在上下文中提供代码。你用什么方法创建计时器,用什么方法使它失效?你确信电话是平衡的吗?尝试在这两个位置添加日志语句,然后查看日志。我敢打赌,在创建一个新的之前,你不会总是让它失效。这就是让我发疯的原因。当我再次使其无效时,计时器停止。