#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
? Возможно, у них должна быть сильная ссылка на ваш объект.