做什么performSelector
?NSThread
创建新方法和方法有什么区别performSelector
?
它是如何工作的,我们应该在哪里使用它?
做什么performSelector
?NSThread
创建新方法和方法有什么区别performSelector
?
它是如何工作的,我们应该在哪里使用它?
所有这些都执行相同的任务,即使doStuff
on 方法在当前线程上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));
anObject
是未知的,通常首先询问对象是否有方法 with -[NSObject respondsToSelector:]
。IMP
(实现),然后直接调用它。如果在紧密循环中使用,有时可以比 1. 快。只要记住; 过早的优化是邪恶的。您需要掌握的是,在 Objective-C 中,方法比类/接口更重要。通常你不会查询一个对象是否属于一个特定的类,或者是否符合任何协议,这是编译器抱怨的。在运行时,您改为查询特定方法。
简而言之:你是什么并不重要,重要的是你能做什么。
为方便起见,NSObject
也有几个兄弟姐妹performSelector
是异步的。最为显着地:
performSelector:withObject:afterDelay:
- 延迟后在当前线程上执行该方法。performSelectorInBackground:withObject:
- 在新的后台线程上执行该方法。performSelectorOnMainThread:withObject:waitUntilDone:
- 在主线程上执行方法。performSelector:onThread:withObject:waitUntilDone:
- 在任何线程上执行该方法。异步执行者都依赖于NSRunLoop
函数。除非您自己生成线程,否则这不是您需要担心的事情。如果你这样做了,那么你还需要运行新线程运行循环。暂时跳过它。