5.18. Exiting Threads and Timers

Problem

You would like to stop a thread or a timer, or prevent one from firing again.

Solution

For timers, use the invalidate instance method of NSTimer. For threads, use the cancel method. Avoid using the exit method of threads, as it does not give the thread a chance to clean up after itself and your application will end up leaking resources:

NSThread *thread = /* Get the reference to your thread here */;
[thread cancel];

NSTimer *timer = /* Get the reference to your timer here */;
[timer invalidate];

Discussion

Exiting a timer is quite straightforward; you can simply call the timer’s invalidate instance method. After you call that method, the timer will not fire any more events to its target object.

However, threads are a bit more complicated to exit. When a thread is sleeping and its cancel method is called, the thread’s loop will still perform its task fully before exiting. Let me demonstrate this for you:

- (void) threadEntryPoint{ @autoreleasepool { NSLog(@"Thread Entry Point"); while ([[NSThread currentThread] isCancelled] == NO){ [NSThread sleepForTimeInterval:4]; NSLog(@"Thread Loop"); } NSLog(@"Thread Finished"); } } - (void) stopThread{ NSLog(@"Cancelling the Thread"); [self.myThread cancel]; NSLog(@"Releasing the thread"); self.myThread = nil; } - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.myThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadEntryPoint) ...

Get iOS 5 Programming Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.