gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:53:35 24 4
gpt4 key购买 nike

我已经盯着我的代码看了好几个小时了,所以我想我可以试着来这里看看新的眼睛。我需要创建一个计时器,所以我使用下面的代码来做到这一点。第一行是我创建计时器的地方,第二部分是我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com