For example, to perform a task after a delay, you should prefer the latter to the
former:
// Using performSelector:withObject:afterDelay:
[self performSelector:@selector(doSomething)
withObject:nil
afterDelay:5.0];
// Using dispatch_after
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(5.0 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^(void){
[self doSomething];
});
To perform a task on the main thread:
// Using performSelectorOnMainThread:withObject:waitUntilDone:
[self performSelectorOnMainThread:@selector(doSomething)
withObject:nil
waitUntilDone:NO];
// Using dispatch_async
// (or if waitUntilDone is YES, then dispatch_sync)
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
Things to Remember
The performSelector family of methods is potentially dangerous with respect to
memory management. If it has no way of determining what selector is going to be
performed, the ARC compiler cannot insert the appropriate memory-management calls.
The family of methods is very limited with respect to the return type and the number of
parameters that can be sent to the method.
The methods that allow performing a selector on a different thread are better replaced
with certain Grand Central Dispatch (GCD) calls using blocks.
former:
// Using performSelector:withObject:afterDelay:
[self performSelector:@selector(doSomething)
withObject:nil
afterDelay:5.0];
// Using dispatch_after
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(5.0 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^(void){
[self doSomething];
});
To perform a task on the main thread:
// Using performSelectorOnMainThread:withObject:waitUntilDone:
[self performSelectorOnMainThread:@selector(doSomething)
withObject:nil
waitUntilDone:NO];
// Using dispatch_async
// (or if waitUntilDone is YES, then dispatch_sync)
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
Things to Remember
The performSelector family of methods is potentially dangerous with respect to
memory management. If it has no way of determining what selector is going to be
performed, the ARC compiler cannot insert the appropriate memory-management calls.
The family of methods is very limited with respect to the return type and the number of
parameters that can be sent to the method.
The methods that allow performing a selector on a different thread are better replaced
with certain Grand Central Dispatch (GCD) calls using blocks.