GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode。通经常使用不到。
kCFRunLoopCommonModes: 这是一个占位的 Mode。没有实际作用。
Run Loop的四个作用:
使程序一直运行接受用户输入
决定程序在何时应该处理哪些Event
调用解耦
节省CPU时间
主线程的run loop默认是启动的。iOS的应用程序里面。程序启动后会有一个例如以下的main() 函数:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([appDelegate class]));
}
}
重点是UIApplicationMain() 函数,这种方法会为main thread 设置一个NSRunLoop 对象,这就解释了本文开始说的为什么我们的应用能够在无人操作的时候歇息,须要让它干活的时候又能立刻响应。
对其它线程来说,run loop默认是没有启动的。假设你须要很多其它的线程交互则能够手动配置和启动。视图的优缺点假设线程仅仅是去运行一个长时间的已确定的任务则不须要。在不论什么一个Cocoa程序的线程中。都能够通过:
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
来获取到当前线程的run loop。
一个run loop就是一个事件处理循环。用来不停的和处理输入事件并将其分配到相应的目标上进行处理。
NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才干是的你不用处理一些非常琐碎非常低层次的详细消息的处理。在NSRunLoop中每个消息就被打包在input source或者是timer source中了。使用run loop能够使你的线程在有工作的时候工作。没有工作的时候休眠,这能够大大节省系统资源。
什么时候使用run loop
仅当在为你的程序创建辅助线程的时候。你才须要显式运行一个run loop。
Run loop是程序主线程基础设施的关键部分。所以,Cocoa和Carbon程序提供了代码运行主程序的循环并自己主动启动run loop。IOS程序中UIApplication的run方法(或Mac OS X中的NSApplication)作为程序启动步骤的一部分。它在程序正常启动的时候就会启动程序的主循环。
相似的,RunApplicationEventLoop函数为Carbon程序启动主循环。假设你使用xcode提供的模板创建你的程序,那你永远不须要自己去显式的调用这些例程。
对于辅助线程,你须要推断一个run loop是否是必须的。假设是必须的。那么你要自己配置并启动它。你不须要在不论什么情况下都去启动一个线程的run loop。
比方。你使用线程来处理一个预先定义的长时间运行的任务时,你应该避免启动run loop。Run loop在你要和线程有很多其它的交互时才须要,比方以下情况:
使用端口或自己定义输入源来和其它线程通信
使用线程的定时器

Cocoa中使用不论什么performSelector…的方法
使线程周期性工作
关注点
Cocoa中的NSRunLoop类并非线程安全的
我们不能再一个线程中去操作另外一个线程的run loop对象,那非常可能会造成意想不到的后果。只是幸运的是CoreFundation中的不透明类CFRunLoopRef是线程安全的,而且两种类型的run loop全然能够混合使用。Cocoa中的NSRunLoop类能够通过实例方法:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76433-4.html
君子一言
打就打