From the -[NSRunLoop run]
docs:
Manually removing all known input sources and timers from the run loop is not a guarantee that the run loop will exit.
You should use a different method, possibly runMode:beforeDate:
in a loop, and, at the same time you invalidate the timer, set a flag indicating that the run loop should end.