Недействительность NSTimer из метода его вызова

Я запланировал таймер, используя [NSTimer scheduleTimerWithTimeInterval: target: selector: userInfo:] и хочу сделать недействительным его в какой-то момент, когда он срабатывает.

- (id)init { [NSTimer scheduledTimerWithInterval:1 target:self selector:@selector(fired:) userInfo:nil repeats:YES]; } - (void)fired:(NSTimer *)timer { if (someCondition) { [timer invalidate]; } } 

Это разрешено? В документации указано

Вы должны отправить это сообщение из потока, на котором был установлен таймер. Если вы отправляете это сообщение из другого потока, источник входного сигнала, связанный с таймером, не может быть удален из цикла запуска, что может помешать правильному выводу потока.

Если это не является правильным способом для выполнения этой задачи: каков правильный путь?

Это прекрасно, чтобы аннулировать его из уволенного метода, поскольку запущенный метод находится в том же потоке, на который был запланирован таймер:

scheduledTimerWithTimeInterval: мишень: селектор: UserInfo: повторы:

Создает и возвращает новый объект NSTimer и планирует его в текущем цикле выполнения в режиме по умолчанию.

Вызов [timer invalidate] из метода пожара просто прекрасен, этот код будет выполнен в том же потоке, что и при создании таймера.

Указанный вами Apple Doc предупреждает только о том, что если вы создадите отдельный поток и отмените от него таймер, тогда и только тогда следует ожидать непредсказуемого поведения.

Ex.

 // Create the background queue dispatch_queue_t queue = dispatch_queue_create("do not do this", NULL); // Start work in new thread dispatch_async(queue, ^ { // !! do not do this !! if (someCondition) { [yourTimer invalidate]; } // or this [self fire:yourTimer]; }); // won't actually go away until queue is empty dispatch_release(queue);