Как проверить, был ли NSTimer уже признан недействительным
У меня есть объект NSTimer
, который мне нужно сделать недействительным, если пользователь нажимает кнопку или выходит из представления.
Итак, у меня есть:
[myNSTimer invalidate];
внутри обработчика кнопок и внутри viewWillDisappear
. Если пользователь нажимает кнопку, а затем существует представление, приложение выдает исключение, потому что myNSTimer
уже недействительно.
То, что мне нужно сделать в методе viewWillDisappear
, это проверить, был ли признак myNSTimer
недействительным или нет. Как это сделать?
Я пробовал:
if(myNSTimer != nil)
[myNSTimer invalidate];
но это не сработало.
Ответы
Ответ 1
Как только вы аннулируете таймер, просто назовите release
на нем (при условии, что вы сохранили ссылку, на которую вы держите), а затем вычеркните свою ссылку. Таким образом, когда вы выходите из представления, пытаясь сделать недействительным таймер, второй раз просто вызовет этот метод вместо nil, что ничего не делает.
В качестве альтернативы вы можете использовать -[NSTimer isValid]
, чтобы проверить, действительно ли он действителен до отмены, но на самом деле нет причин удерживать вашу ссылку после аннулирования ее в первый раз. Кроме того, если ваша настоящая проблема заключается в том, что вы не сохранили свою ссылку, и поэтому первая -invalidate
фактически оставляет вас ссылкой, указывающей на выпущенный объект, тогда вызов -isValid
не поможет.
Ответ 2
То, что я обычно делаю, это nil-out переменная-член, удерживающая таймер, либо когда она срабатывает, либо когда я ее недействителен. Тогда вы можете просто сделать:
[myNSTimer invalidate];
myNSTimer = nil;
и он пойдет правильно.
Ответ 3
У меня была такая же проблема, когда я пытался приостановить и перезапустить таймер. Чтобы остановить его:
[timer invalidate];
[timer release];
timer = nil;
И запустить/перезапустить его:
timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain];
Теперь он не сбой, когда я его недействителен.
Ответ 4
Swift:
if timer.valid {
timer.invalidate()
}