Почему `cancelPreviousRequestsWithTarget` не отменяет NSTimer? - PullRequest
0 голосов
/ 29 сентября 2011

Я планирую NSTimer экземпляр следующим образом:

    [NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(someMethod) userInfo:nil repeats:YES];

Я могу позвонить invalidate на моем NSTimer, чтобы остановить его, но

    [NSTimer cancelPreviousPerformRequestsWithTarget:self];

не останавливает таймер. Я проверил, и [NSRunLoop currentRunLoop] точно такой же (как и ожидалось, это в ответах на щелчки пользователей), и, конечно, экземпляр self всегда одинаков. Почему cancel не отменить?

1 Ответ

3 голосов
/ 29 сентября 2011

cancelPreviousPerformRequestsWithTarget: - это метод NSObject, а не метод NSTimer, и он обратен performSelector: методам NSObject.

[NSTimer cancelPreviousPerformRequestsWithTarget:self] - это то же самое, что и [NSObject cancelPreviousPerformRequestsWithTarget:self], и то, что он отменяет,любые предыдущие [self performSelector:… withObject:… afterDelay:…] сообщения.Он не имеет ничего общего с экземплярами NSTimer.

Отправка сообщения в класс NSTimer, а не в класс NSObject, работает так же, как отправка alloc в класс.Никакие классы не переопределяют это;это работает, потому что реализация NSObject наследуется, и делает то же самое по той же причине.

...