PerformSelector
Posted Xylophone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PerformSelector相关的知识,希望对你有一定的参考价值。
PerformSelector
1. 执行和取消
//执行 [self performSelector:@selector(showMessage) withObject:nil afterDelay:0]; //取消 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showMessage) object:nil];
(1)PerformSelector与直接调用的区别
performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。如果上面例子中showMessage不存在,则performSelector方法会运行时崩溃。所以,使用performSelector方法之前,应该使用方法- (BOOL)respondsToSelector:(SEL)aSelector;进行安全检查,以保证程序的健壮性。
(2) performSelector与RunLoop
RunLoop有两种输入源:基于端口的输入源和自定义输入源。performSelector就是属于自定义输入源。使用performSelector时,就会把相应事件加到线程对应的RunLoop里进行管理。
(3) 取消performSelector
对于 [performSelector:withObject: afterDelay:];方法,afterDelay的时间设置后,performSelector的执行不会因为当前的viewController的灭亡而取消执行,因此需要在合适的时机cancel掉前面的PerformRequests。
2. 在主线程执行的方法
(1)performSelector在主线程执行
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullableid)arg waitUntilDone:(BOOL)wait;
wait:指示要执行的aSelector方法是否马上执行。
如果设置为YES:等待当前线程执行完以后,主线程才会执行aSelector方法;
设置为NO:不等待当前线程执行完,就在主线程上执行aSelector方法。
如果当前线程就是主线程,无论设置为YES还是NO,aSelector方法都会马上执行。
(2)GCD的dispatch_async方法
dispatch_async(dispatch_get_main_queue, ^{ // do something });
以上是关于PerformSelector的主要内容,如果未能解决你的问题,请参考以下文章
iPhone - 如何使用具有复杂参数的 performSelector?
performSelector withObject afterDelay 在子线程上调用不运行
performSelector:onThread 中断运行循环?
performSelector may cause a leak because its selector is unknown