我从viewDidLoad
调用了我的计时器。当计时器第一次调用选择器时,预期结果很好。但是在调用时逐渐地,选择器会以某种方式多次调用该函数。我记录了NSLog
,表明输出数量在增加。我有下面的代码。希望它能使情况变得清晰。
-(void)viewDidLoad
{
remainingTicks = 10;
[self updateLabel];
myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(handleTimerTick)
userInfo:nil
repeats:YES];
}
-(void)handleTimerTick
{
remainingTicks--;
[self updateLabel];
if (remainingTicks <= 0) {
[myTimer invalidate];
myTimer = nil;
UIButton *but = [[UIButton alloc] init];
if (answerAt == 0) {
[buttonA setBackgroundColor:[UIColor greenColor]];
}
else if (answerAt == 1) {
[buttonB setBackgroundColor:[UIColor greenColor]];
}
else if (answerAt == 2) {
[buttonC setBackgroundColor:[UIColor greenColor]];
}
else {
[buttonD setBackgroundColor:[UIColor greenColor]];
}
[self performSelector:@selector(next:) withObject:but afterDelay:1.5 ];
}
}
-(void)updateLabel
{
timerLabel.text = [[NSNumber numberWithUnsignedInt: remainingTicks] stringValue];
}
答案 0 :(得分:0)
ViewDidLoad
的生命周期内可以多次调用 UIViewController
(例如,如果您收到内存警告并且您的视图不可见,控制器将释放它并在下次重新加载它时#39;需要)。要正确处理此行为,您应该:
A)在创建计时器之前测试计时器是否存在(例如if (myTimer == nil) { /* initialize the timer */ }
)
或
B)用viewDidUnload
方法清除计时器。 (这可能更符合您的要求,因为您很可能不希望计时器触发与不可见视图相关的事件。)
答案 1 :(得分:0)
将NSTimer的目标设置为弱自变量,如下所示:
__weak Object *weakSelf = self;
[NSTimer scheduledTimerWithTimeInterval:5.f target:weakSelf selector:@selector(actionMethod) userInfo:nil repeats:YES];
这将阻止多次调用该动作。