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) ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access