When you create an NSTimer, and specify it to be a non-repeat timer, you don’t have to invalidate it after it fired.

When you created a repeating timer, you send the invalidate message to it to remove it from the NSRunLoop object it was added to, and thus stopping it from being fired any more. When you invalidated an NSTimer object, you cannot use it again.

More info here and here.