iOS面试

OC-RunLoop简单介绍

2019-03-29  本文已影响0人  SK丿希望

概念

运行循环
每个线程都有一个RunLoop对象,但是只有主线程的RunLoop是开启的。子线程中的RunLoop默认是不被创建的,在子线程中当我们调用NSRunLoop *runloop = [NSRunLoop currentRunLoop];获取RunLoop对象的时候,就会创建RunLoop
一个线程可以开启多个RunLoop,只不过都是嵌套在最大的RunLoop中

作用

使程序一直运行并接收用户的输入
决定程序在何时处理哪些事件
调用解耦(主调方产生很多事件,不用等到被调方处理完事件之后,才能执行其他操作)
节省CPU时间(当程序启动后,什么都没有执行的话,就不用让CPU来消耗资源来执行,直接进入睡眠状态)

NSRunLoopMode

每一个RunLoop都包含若干个CFRunLoopMode
在同一时间,只能在一种Mode下面执行
当需要切换Mode的时候,就必须退出当前的RunLoop。重新启动一个

  • kCFRunLoopDefaultMode: 默认 mode,也是空闲状态,通常主线程在这个 Mode 下运行。
  • UITrackingRunLoopMode: 追踪mode,保证Scrollview滑动顺畅不受其他 mode 影响。
  • UIInitializationRunLoopMode: 启动程序后的过渡mode,启动完成后就不再使用。
  • GSEventReceiveRunLoopMode: Graphic相关事件的mode,通常用不到。
  • kCFRunLoopCommonModes: 占位mode,包括了DefaultMode和CommonMode2种模式。

CFRunLoopMode又包含若干个CFRunLoopSource\ CFRunLoopTimer\ CFRunLoopObserver

做图片轮播器的时候,自动轮播一般是使用NSTimer来完成,如果使用的是kCFRunLoopDefaultMode,那么当ScrollView滚动的时候,RunLoop模式就会切换为UITrackingRunLoopMode,这时候NSTimer就没法执行,这时候我们可以使用kCFRunLoopCommonModes,就可以解决这个问题。

以上来源

其他

每个线程(包含主线程)都有一个Runloop。对于每一个Runloop,系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个像callstack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。

上一篇 下一篇

猜你喜欢

热点阅读