Objective-C高级编程:RunLoop

RunLoop提供一种可以让线程随时处理事件而不退出的机制**
RunLoop实际是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数执行Event Loop的逻辑。
线程执行了这个函数后,就会一直处于这个函数内部"接受消息->等待->处理"的循环中,直到这个循环结束,函数返回。让线程在没有处理消息时休眠以避免资源占用,在由消息时立刻被唤醒。

iOS系统内部提供了:NSRunLoop和CFRunLoopRef。CFRunLoopRef是在CoreFoundation框架内的,它提供了纯C函数的API,所以这些API都是线程安全的。
NSRunLoop是基于CFRunLoopRef的封装,提供了面向对象的API,但是这些API不是线程安全的。
线程和 RunLoop 之间是一一对应的,其关系是保存在一个全局的 Dictionary 里。线程刚创建时并没有 RunLoop,如果你不主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生在线程结束时。

RunLoop的四个作用
使程序一直运行接收用户输入
调用解耦
节省CPU时间
决定程序何时调用哪些Event

主线程的run loop默认是启动的
获取当前线程的RunLoop
NSRunLoop *runloop = [NSRunLoop currentRunLoop];

一个runloop就是一个事件处理循环,用来不停的监听和处理输入事件并将其分配到对应的目标上进行处理

NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很低层次的具体消息的处理,在NSRunLoop中每一个消息就被打包在input source或者是timer source中了。使用run loop可以使你的线程在有工作的时候工作,没有工作的时候休眠,这可以大大节省系统资源

你可能感兴趣的:(Objective-C高级编程:RunLoop)