Because you put a loop around it. (You actually call it twice per loop, since you call it again in the NSLog()
call.)
-runMode:beforeDate:
returns YES
if the run loop has any sources or timers. Running a run loop services those sources and timers but doesn't remove or "consume" them. So, if you loop once, you're likely to loop forever. (If all input sources and timers were removed from the run loop, your while
loop would exit, but you can't rely on that. The frameworks may add sources or timers that you don't control to the run loop.)
What are you trying to do? Why are you running the run loop anyway?