ios - 为什么我的 NSTimer 会双倍递减我的计时器?

标签 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];
}

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

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

最佳答案

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

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

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

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

编辑:

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

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

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

然后查看您的日志,看看您的 decrementTime 方法是否被 2 个不同的计时器调用(我敢打赌它是。)

您可能还想记录从调用 scheduledTimerWithTimeInterval 中返回的计时器的地址...

关于ios - 为什么我的 NSTimer 会双倍递减我的计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27369688/

相关文章:

ios - NSURLSession dataTaskWithRequest 只在第一次工作

ios - 是否可以在 sprite-kit 游戏中使用 Twitter/Facebook 分享按钮?

objective-c - 寻找有关界面组件自定义绘图的信息(Cocoa)

ios - 如何从地址簿中检索 'self'

如果从计时器任务调用,Android 对话框根本不显示

ios - topLayoutGuide 在 vi​​ewWillAppear 之后应用

ios - 将 Swift 文件添加到我的项目会导致无效模块错误

javascript - 在 jQuery 中调用 .append() 后处理计时的正确方法

javascript - 倒计时达到 0 时发出蜂鸣声

ios - 从 Core Data Swift 中删除值时出现错误 Domain=NSCocoaErrorDomain Code=1570