performSelector方法有什么作用?

时间:2010-11-30 12:43:47

标签: objective-c cocoa cocoa-touch cocoa-design-patterns

performSelector做什么?创建新的NSThreadperformSelector方法有什么区别?

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

2 个答案:

答案 0 :(得分:23)

所有这些都执行相同的任务,即doStuff方法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的类是未知的,通常首先询问该对象是否具有-[NSObject respondsToSelector:]的方法。
  3. 是否实际编译为1。通常从来没有真正需要这样做。
  4. 为方法缓存实际的IMP (实现),然后直接调用它。如果在紧密循环中使用,有时可以快于1.只记得; 过早优化是邪恶的
  5. 您需要掌握的是Objective-C方法比类/接口更重要。通常,如果对象属于特定类,或者符合任何协议(即编译器要抱怨),则不会查询该对象。在运行时,您可以查询特定方法。

    简而言之:无论你是什么,只要你能做什么都没关系。

    为方便起见,NSObject也有几个同步的performSelector兄弟姐妹。最值得注意的是:

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

    异步执行者都依赖于NSRunLoop来运行。除非你自己生成一个线程,否则这不是你需要担心的事情。如果这样做,您还需要运行新线程运行循环。现在就跳过它。

答案 1 :(得分:2)

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

与运行新线程非常不同。

我认为您最好阅读selectors