Подтвердить что ты не робот

Как проверить, был ли NSTimer уже признан недействительным

У меня есть объект NSTimer, который мне нужно сделать недействительным, если пользователь нажимает кнопку или выходит из представления.

Итак, у меня есть:

[myNSTimer invalidate];

внутри обработчика кнопок и внутри viewWillDisappear. Если пользователь нажимает кнопку, а затем существует представление, приложение выдает исключение, потому что myNSTimer уже недействительно. То, что мне нужно сделать в методе viewWillDisappear, это проверить, был ли признак myNSTimer недействительным или нет. Как это сделать?

Я пробовал:

if(myNSTimer != nil)
  [myNSTimer invalidate];

но это не сработало.

4b9b3361

Ответ 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()
}