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