9

做什么performSelectorNSThread创建新方法和方法有什么区别performSelector

它是如何工作的,我们应该在哪里使用它?

4

2 回答 2

23

所有这些都执行相同的任务,即使doStuffon 方法在当前线程上anObject同步执行:

// 1
[anObject doStuff];

// 2
[anObject performSelector:@selector(doStuff)];

// 3
objc_msgSend(anObject, @selector(doStuff));

// 4
IMP imp = [anObject methodForSelector:@selector(doStuff)];
imp(anObject, @selector(doStuff));
  1. 是你通常应该如何去做的事情。
  2. 用于动态调度消息。如果选择器未知,或者由客户端提供,例如,如果您实现目标操作模式,则使用该选择器。或者如果类anObject是未知的,通常首先询问对象是否有方法 with -[NSObject respondsToSelector:]
  3. 是什么没有 1. 实际上被编译下来。通常从来没有真正需要这样做。
  4. 缓存一个方法的实际IMP (实现),然后直接调用它。如果在紧密循环中使用,有时可以比 1. 快。只要记住; 过早的优化是邪恶的

您需要掌握的是,在 Objective-C 中,方法比类/接口更重要。通常你不会查询一个对象是否属于一个特定的类,或者是否符合任何协议,这是编译器抱怨的。在运行时,您改为查询特定方法。

简而言之:你是什么并不重要,重要的是你能做什么。

为方便起见,NSObject也有几个兄弟姐妹performSelector是异步的。最为显着地:

  • performSelector:withObject:afterDelay:- 延迟后在当前线程上执行该方法。
  • performSelectorInBackground:withObject:- 在新的后台线程上执行该方法。
  • performSelectorOnMainThread:withObject:waitUntilDone:- 在主线程上执行方法。
  • performSelector:onThread:withObject:waitUntilDone:- 在任何线程上执行该方法。

异步执行者都依赖于NSRunLoop函数。除非您自己生成线程,否则这不是您需要担心的事情。如果你这样做了,那么你还需要运行新线程运行循环。暂时跳过它。

于 2010-11-30T15:48:32.130 回答
2

performSelector执行一个选择器。换句话说,它调用了一个方法。

这与运行一个新线程非常不同。

我认为您最好阅读selectors

于 2010-11-30T12:51:08.483 回答