1

performSelector 是立即执行还是计划稍后执行?

4

2 回答 2

4

文档

performSelector:方法相当于直接向接收者发送一个 aSelector 消息。

所以它立即执行。

同样来自文档,这两条消息是等效的

id myClone = [anObject copy];
id myClone = [anObject performSelector:@selector(copy)];

并且它们实际上都将最终编译成

objc_msgSend(anObject, @selector(copy));

编辑

在根据 Anoop 的回答进行讨论之后,我认为值得指出的是,并非所有的变体都会performSelector:立即执行。有一堆由它定义的变体NSObject将导致动作被安排。此外,重要的是要注意,即使在 0 延迟的情况下也是如此,正如文档中明确指出的那样:

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

总结一下,这是一个相关的变体列表

立即执行的变体:

  • performSelector:
  • performSelector:withObject:
  • performSelector:withObject:withObject:

计划执行的变体(即使延迟为 0)

  • performSelector:withObject:afterDelay:
  • performSelector:withObject:afterDelay:inModes:
  • performSelectorOnMainThread:withObject:waitUntilDone:
  • performSelectorOnMainThread:withObject:waitUntilDone:modes:
  • performSelector:onThread:withObject:waitUntilDone:
  • performSelector:onThread:withObject:waitUntilDone:modes:
  • performSelectorInBackground:withObject:
于 2013-04-09T03:44:36.807 回答
1

performSelector:performSelector:withObject:performSelector:withObject:withObject:立即执行。

你可以在这里找到文档

于 2013-04-09T03:44:36.177 回答