RunLoop简单探索

RunLoop

  • RunLoop是事件接收和分发机制的一个实现,是线程相关的基础框架的一部分,一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。

  • RunLoop本质是一个 do-while循环,没事做就休息,来活了就干活。与普通的while循环是有区别的,普通的while循环会导致CPU进入忙等待状态,即一直消耗cpu,而RunLoop则不会,RunLoop是一种闲等待,即RunLoop具备休眠功能。 RunLoop的作用

  • 保持程序的持续运行

  • 处理App中的各种事件(触摸、定时器、performSelector)

  • 节省cpu资源,提供程序的性能,该做事就做事,该休息就休息 2、RunLoop和线程的关系

    image.jpeg

    image.jpeg

    image.jpeg

    image.jpeg

image.jpeg

RunLoop和mode是一对多
mode和Item也是一对多


image.jpeg

相关面试题

面试题1当前有个子线程,子线程中有个timer。timer是否能够执行 并进行持续的打印?

image.jpeg


不可以,因为子线程的runloop默认不启动, 需要runloop run启动,需要将上述代码改成下面这样


image.jpeg

面试题2:RunLoop和线程的关系

  • 每个线程都有一个与之对应的RunLoop,所以RunLoop与线程是一一对应的,其绑定关系通过一个全局的DIctionary存储,线程为key,runloop为value。
  • 线程中的RunLoop主要是用来管理线程的,当线程的RunLoop开启后,会在执行完任务后进行休眠状态,当有事件触发唤醒时,又开始工作,即有活时干活,没活就休息
  • 主线程的RunLoop是默认开启的,在程序启动之后,会一直运行,不会退出
  • 其他线程的RunLoop默认是不开启的,如果需要,则手动开启 面试3:NSRunLoop 和 CFRunLoopRef 区别
  • NSRunLoop是基于CFRunLoopRef面向对象的API,是不安全的
  • CFRunLoopRef是基于C语言,是线程安全的 面试5:以+scheduledTimerWithTimeInterval:的方式触发的timer,在滑动页面上的列表时,timer会暂停回调, 为什么?如何解决?
  • timer停止的原因是因为滑动scrollView时,主线程的RunLoop会从NSDefaultRunLoopMode切换到UITrackingRunLoopMode,而timer是添加在NSDefaultRunLoopMode。所以timer不会执行
  • 将timer放入NSRunLoopCommonModes中执行

你可能感兴趣的:(RunLoop简单探索)