如何防止NSTimer多次调用我的选择器功能?

时间:2012-04-30 10:11:35

标签: objective-c ios nstimer

我从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];
}

2 个答案:

答案 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];

这将阻止多次调用该动作。