“performSelector:withObject:afterDelay:”之间的区别是什么,其中delay是0,只是调用选择器?

时间:2012-10-19 03:38:02

标签: objective-c selector messaging

我正在开发一个使用第三方SDK的iPad项目,并且已经阅读了SDK代码以了解它和objective-c。我在异步回调中遇到了以下行:

[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];

我已阅读该选择器上的the documentation。相关的行似乎如下:

  

指定延迟0并不一定会导致选择器立即执行。选择器仍然在线程的运行循环中排队,并尽快执行。

我无法确定为什么要写[self performSelector:@selector(doSomething) withObject:nil afterDelay:0],而不是仅仅写[self doSomething]。在我看来,延迟为零意味着应该立即进行呼叫。显然我遗漏了一些东西,框架作者不太可能随意选择这种方法。其他StackOverflow答案也没有说明这一点。是否使用了“performSelector”选择器,因为doSomething选择器本身是异步的,并且调用是在异步回调中进行的?

我确实发现another link建议如下:

  

有趣的是,使用performSelector和afterDelay也会让警告[即,编译器警告]消失:...

     

[self performSelector:aSelector withObject:nil afterDelay:0.0];

作者是否也使用此代码来仅抑制编译器警告?如果是这种情况,那么最好通过clang push / pops来抑制警告,如this thread中所示。

如果有人有一个有说服力的解释为什么作者使用... afterDelay方法,我将不胜感激。感谢。

编辑2012年10月22日:我不相信@rmaddy给出的唯一答案完全适用于我的情况,但它仍然是一个很好的答案,所以我会接受它。我会密切关注这个问题,如果我发现任何新的东西,我会回来。谢谢。 J.Z。

1 个答案:

答案 0 :(得分:6)

可能使用类似的东西:

[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];

是在调用'doSomething'之前允许当前的runloop完成。换句话说,在调用'doSomething'之前,可以完成当前调用堆栈(当前方法返回)。通常这用于为UI提供更新的机会。

虽然没有更多的背景,但很难知道作者的真实意图,但这是一种常见的用途。