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 在子线程上调用不运行

iOS performSelector(参考)

performSelector:onThread 中断运行循环?

performSelector may cause a leak because its selector is unknown

performSelector