面试整理六(Runloop)

讲讲Runloop,项目中有用到吗?

其实Runloop内部就是一个do while循环,这个循环内部不断处理各种任务(比如Source, timer, observer),一个线程对应一个runloop,主线程的runloop默认开启,子线程的runloop需要手动开启(调用run方法),runloop只能选择一个mode启动,如果当前mode中没有任何source(source0,source1)、timer,那么就直接退出runloop。

Runloop的基本作用:
保持程序的持续运行
处理APP中的各种事件(比如触摸事件、定时器事件)
节省CPU资源,提高程序性能:该做事时做事,该休息时休息

Runloop应用范畴:
定时器(timer)、performSelector
GCD Async Main Queue
事件响应、手势识别、界面刷新
网络请求
AutoreleasePool

Runloop在实际项目中应用:
控制线程生命周期(线程保活 AFNetworking就是使用Runloop使子线程保活)
解决NSTimer在滑动时停止工作问题
监控应用卡顿
性能优化

Runloop的内部实现逻辑

Runloop的内部实现逻辑图.jpg

Runloop和线程的关系

每一条线程都有唯一的一个与之对应的Runloop对象
Runloop保存在一个全局的Dictionary里,线程作为Key,Runloop作为value
线程刚创建事没有Runloop对象,Runloop会在第一次获取它时创建

timer与Runloop的关系,拖动tableView时,timer无法响应要怎么解决

timer是运行在Runloop里的,runloop来控制timer什么时候执行。

Runloop是怎么响应用户操作的,具体流程

说说Runloop的几种状态

Runloop的mode作用是什么

RunLoop的运行模式(一共5种)

  • kCFRunLoopDefaultMode:APP默认mode,通常主线程在这个mode下运行
  • UITrackingRunLoopMode:界面跟踪mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode的影响。
  • UIInitializationRunLoopMode:在刚启动APP时进入的第一个mode,启动完成后就不在使用
  • GSEventReceiveRunLoopMode:接受系统事件的内部mode,通常用不到
  • kCFRunLoopCommonModes:这是一个占位用的mode,不是一种真正的运行模式
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容