RunLoop是一种让线程随时处理事件而不退出的机制。RunLoop实际上是一个对象管理了其需要处理的事件和消息。RunLoop让线程在需要处理事件的时候被唤醒,不需要处理事件的时候休眠,节省资源。它是一个监听事件的换,将事件分配到各个目标进行处理。
OSX/IOS提供了两个这样的对象,NSRunLoop和CFRunLoopRef,CFRunLoopRef是在coreFundation框架下的,是纯C语言的API,所有的这些API都是线程安全的。NSRunLoop是基于CFRunLoopRef的封装,是面向对象的API,但这些API都不是线程安全的。
线程的RunLoop是一一对应的。
RunLoop的四个作用:
1、是程序一直运行,接收用户输入
2、决定程序何时应该处于哪个Event
3、调用解耦
4、节省CPU时间
主线程会自动启动runLoop,辅线程是在需要的时候手动启动runloop
在与线程有更多的交互的时候才需要启动runLoop
比如:cocoa中performSelector。。方法
使用线程定时器
使用线程周期性工作
使用端口或者自定义的输入源来跟线程通信
在使用手动管理内存的项目中,会遇到很多自动释放的对象,如果这些对象的内存不能及时释放,那么机会导致内存极大地被占用。RunLoop就做了这样的工作,当一个循环结束的时候,它都会释放一次autorelease pool