What are the different ways for calling my method on separate thread?
Usually, you would prefer the GCD approach.
It's simpler when it comes to synchronization/locking than pure threads (NSThread - pthread), and it may be more accurate in a performance perspective.
When using pure threads, the problem is you may have performance issues, depending on the number of available cores/processors.
For instance, if you have only one core, creating many threads may slow down your application, because the CPU will spend most of its time switching from one thread to another, saving the stack, registers, etc.
On the other hand, if you have a lot of cores available, it may be nice to create a lot of different threads.
This is where GCD helps, as it manages this for you. It will create the appropriate number of threads, based on the available system resources, to guarantee an optimal utilization, and schedule your actions appropriately.
However, for that reason, tasks launched with GCD may not be real-time.
So if you REALLY needs that a detached task runs immediately, use an explicit threads. Otherwise, use GCD.
Hope this will help you : )
A note about
performSelectorInBackground: it simply creates a new thread. So there's basically no difference with the NSThread approach.
NSOperation related stuff are a bit different. On Mac OS X, they are implemented using GCD since version 10.6. Previous versions uses threads.
On iOS, they are implemented using threads only.
All of this is very well explained in the Concurrency Programming Guide. It discusses the GCD and thread approaches, with a lot of details about the uses and implementations.
If you haven't read it already, you should take a look.
Here is an updated answer to this old question. NSOperations are implemented with libdispatch for both macos and ios now. They have been for some time. The preferred way to call to a different thread is with one of libdispatch or NSOperations. The main idea to keep in mind is "Quality of Service", or "QOS". A QOS is something assigned to a thread, and when you assign it to a dispatch queue, and NSOperationQueue, or an NSOperation, you are essentially saying, "I want this to run on a thread with this QOS assigned." The special case is the main thread.
There might still be some cases to use NSThread, but I haven't had any for a long time.