Попытка деактивировать NSTimer

#objective-c

#objective-c

Вопрос:

Я использую NSTimer для запуска цикла обратного отсчета, а затем в какой-то момент (нажав «пуск») Мне нужно запустить это еще раз. Однако первый таймер не останавливается, поэтому скорость обратного отсчета увеличивается с каждым запуском функции

 - (IBAction)startbutton:(id)sender {

    timeTick = arc4random_uniform(7) 3;
    timeofstart = CACurrentMediaTime();

    chosentime = timeTick;
    NSLog(@"chosentime værdien er %f", chosentime);


    [timer invalidate];
    timer = nil;

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];

}


- (void) tick {

  if (timeTick == 0) {
    winnerlabel2.text = @"GO !!!";

  }
  else {
    timeTick --;
    NSLog(@"%f", timeTick);
  }

}
  

Ответ №1:

Здесь неясно, что timer имеется в виду в этих первых 2 строках. Эта 3-я строка создает новую локальную переменную. Похоже, у вас должна быть переменная экземпляра timer , которая создается где-то в другом месте. Вы аннулируете этот таймер, но затем создаете new timer как локальную переменную, у которой нет постоянного дескриптора (потому что он умирает после выхода из области видимости в конце этого вызова метода), и, таким образом, каждый таймер после первого никогда не становится недействительным.

 [timer invalidate];
timer = nil;

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];
  

Измените эту 3-ю строку из…

 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];
  

Для…

 timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];