I schedule an NSTimer instance like this:
[NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(someMethod) userInfo:nil repeats:YES];
I am able to call invalidate on my NSTimer to stop it from firing, but
[NSTimer cancelPreviousPerformRequestsWithTarget:self];
does not stop the timer. I have checked and [NSRunLoop currentRunLoop] is exactly the same (as expected, these are in responses to user clicks) and of course the self instance is always the same. Why doesn’t cancel cancel?
cancelPreviousPerformRequestsWithTarget:is an NSObject method, not an NSTimer method, and it is the inverse of NSObject’sperformSelector:methods.[NSTimer cancelPreviousPerformRequestsWithTarget:self]is the same as[NSObject cancelPreviousPerformRequestsWithTarget:self], and what it cancels is any previous[self performSelector:… withObject:… afterDelay:…]messages. It has nothing to do with any NSTimer instances.Sending the message to the NSTimer class rather than the NSObject class works the same way that sending
allocto a class does. No classes override it; it works because NSObject’s implementation is inherited, and it does the same thing for the same reason.