KM的博客.

Runloop

字数统计: 536阅读时长: 2 min
2018/06/01

Runloop

1.讲讲 RunLoop,项目中有用到吗?

  • 事件循环,在程序运行中循环做一些事情
  • 没有消息mach_msg()切换用户态到内核态线程休眠,有消息内核态切换到用户态

runloop相关:

  • Timer、performSelector
  • GCD、AutoreleasePool
  • 事件响应、收拾识别、网络请求

runloop的应用:

  • 线程包活
  • 解决timer滑动停止问题
  • 监听主线程卡顿
  • 性能优化

2.runloop的6种状态和runloop内部实现逻辑?

1
2
3
4
5
6
7
8
9
10
/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), // 即将进入Loop
kCFRunLoopBeforeTimers = (1UL << 1), //即将处理Timer
kCFRunLoopBeforeSources = (1UL << 2), //即将处理Source
kCFRunLoopBeforeWaiting = (1UL << 5), //即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6), //刚从休眠中唤醒
kCFRunLoopExit = (1UL << 7), //即将退出Loop
kCFRunLoopAllActivities = 0x0FFFFFFFU
};
  • source0 : 触摸事件、performSelectorOnThread:
  • source1: 基于Port的线程间通讯,捕获到的系统事件
  • timers: NSTimer + performSelector:afterDelay:
  • observers: 监听runloop的状态/autoreleasePool的创建和释放、UI的刷新

img

3.runloop和线程的关系?

  • 一一对应
  • 保存在一个全局字典中,线程是key, runloop是value
  • 子线程默认没有runloop,在第一次获取runloop时才会创建。
  • runloop在线程结束时销毁

4.timer 与 runloop 的关系?

程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?

5.runloop 是怎么响应用户操作的, 具体流程是什么样的?

6.说说runLoop的几种状态

7.runloop的mode作用是什么?

  • CFRunLoopModeRef代表RunLoop的运行模式

  • 一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer

  • RunLoop启动时只能选择其中一个Mode,作为currentMode

  • 如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入

  • 不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响

  • 如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出

8.KVO实现原理?哪些情况下使用kvo会崩溃,怎么防护崩溃?

9.如何手动关闭KVO?如何手动自己实现KVO说说思路

10.通过KVC修改属性会触发KVO么

CATALOG
  1. 1. Runloop
    1. 1.1. 1.讲讲 RunLoop,项目中有用到吗?
      1. 1.1.1. runloop相关:
      2. 1.1.2. runloop的应用:
    2. 1.2. 2.runloop的6种状态和runloop内部实现逻辑?
    3. 1.3. 3.runloop和线程的关系?
    4. 1.4. 4.timer 与 runloop 的关系?
    5. 1.5. 程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?
    6. 1.6. 5.runloop 是怎么响应用户操作的, 具体流程是什么样的?
    7. 1.7. 6.说说runLoop的几种状态
    8. 1.8. 7.runloop的mode作用是什么?
    9. 1.9. 8.KVO实现原理?哪些情况下使用kvo会崩溃,怎么防护崩溃?
    10. 1.10. 9.如何手动关闭KVO?如何手动自己实现KVO说说思路
    11. 1.11. 10.通过KVC修改属性会触发KVO么