performSelector方法有什么作用?

ash*_*ish 9 cocoa cocoa-touch objective-c cocoa-design-patterns

怎么performSelector办?创建新方法NSThreadperformSelector方法有什么区别?

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

Pey*_*loW 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));
Run Code Online (Sandbox Code Playgroud)
  1. 你通常应该怎么做呢.
  2. 用于动态调度消息.如果选择器未知或由客户端提供,则使用,例如,如果您实现目标操作模式.或者如果类anObject是未知的,通常首先询问对象是否具有该方法-[NSObject respondsToSelector:].
  3. 是什么没有1.实际编译到.通常从来没有真正需要这样做.
  4. 缓存方法的实际IMP (实现),然后直接调用它.如果在紧密循环中使用,有时可以快于1. 只记得; 过早优化是邪恶的.

您需要掌握的是Objective-C方法比类/接口更重要.通常,如果对象属于特定类,或者符合任何协议(即编译器要抱怨),则不会查询该对象.在运行时,您可以查询特定方法.

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

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

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

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