Утечка памяти NSTimer?

#ios #objective-c #xcode #nstimer

#iOS #objective-c #xcode #nstimer

Вопрос:

Приведет ли следующее к утечке памяти или ее можно как-то изменить, чтобы она была лучше? С countDownTimer = nil удалением

 -(void)viewDidLoad{    
  countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES];
}

-(void)pauseTimer{            
   NSLog(@"Fired");
   [countDownTimer invalidate];
   //countDownTimer = nil <------ Causes crash when run
}

-(void)resumeTimer{
   countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(loadNewTime:) userInfo:nil repeats:YES];
}
  

Ответ №1:

Можно использовать block вариант scheduleTimer метода, чтобы избежать циклов сохранения.

 var timer = Timer()

func startTimer() {
  timer = Timer.scheduleTimer(withTimerInterval: 1.0, repeats: true, block: { [weak self] (timer) in
     self?.performUpdate(timer: timer)
  })
}

func stopTimer() {
   timer.invalidate()
}
  

Просто убедитесь, что вы записали self как weak переменную.

Ответ №2:

NSTimer автоматически уменьшает количество сохранений, когда оно истекает или становится недействительным. Нет необходимости устанавливать его равным нулю, если вы не назначили его для ivar, который сохраняется. (что в вашем случае означает, что вам также необходимо было бы назначить таймер с помощью self.CountDownTimer

Ответ №3:

Я полагаю countDownTimer , это ivar? NSTimer s сохраняют свои цели, пока они живы, поэтому похоже, что ваш вызов [countDownTimer invalidate] освобождает последнюю ссылку на self и вызывает self освобождение в середине вашего -pauseTimer метода. Таким образом, любая ссылка на self , даже неявные ссылки (например, доступ к ivars) приведет к сбою или, по крайней мере, поведет себя неожиданно.

Кто звонит -pauseTimer ? Возможно, у них должна быть сильная ссылка на ваш объект.