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

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

2 голосов
/ 19 октября 2011

Приведет ли следующее к утечке памяти или ее можно как-нибудь изменить?С удалением 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];
}

Ответы [ 3 ]

1 голос
/ 19 октября 2011

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

1 голос
/ 10 марта 2019

Можно использовать 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.

1 голос
/ 19 октября 2011

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

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

...