Как проверить, был ли NSTimer уже признан недействительным - PullRequest
12 голосов
/ 15 декабря 2008

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

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

[myNSTimer invalidate];

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

Я пробовал:

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

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

Ответы [ 4 ]

33 голосов
/ 15 декабря 2008

Как только вы сделаете недействительным таймер, просто наберите на нем release (при условии, что вы сохранили ссылку, на которой держитесь), а затем обнулите свою ссылку. Таким образом, когда вы выходите из представления, попытка аннулировать таймер во второй раз просто вызовет этот метод вместо nil, который ничего не делает.

В качестве альтернативы, вы можете использовать -[NSTimer isValid], чтобы проверить, является ли он действительным до аннулирования, но на самом деле нет никакой причины удерживать вашу ссылку после ее аннулирования в первый раз в любом случае. Кроме того, если ваша настоящая проблема заключается в том, что вы не сохранили свою ссылку, и поэтому первый -invalidate фактически оставляет вас со ссылкой, указывающей на освобожденный объект, то вызов -isValid в любом случае не поможет.

6 голосов
/ 15 декабря 2008

Что я обычно делаю, так это обнуляю переменную-член, содержащую таймер, либо когда он срабатывает, либо когда я его аннулирую Тогда вы можете просто сделать:

[myNSTimer invalidate]; 
myNSTimer = nil;

и все будет правильно.

3 голосов
/ 11 октября 2012

У меня была такая же проблема, когда я пытался приостановить и перезапустить таймер. Чтобы остановить это:

[timer invalidate];
[timer release];
timer = nil;

И чтобы запустить / перезапустить его:

timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain];

Теперь он не падает, когда я его аннулирую.

1 голос
/ 20 апреля 2016

Свифт:

if timer.valid {
   timer.invalidate()
}
...