RunLoop回忆录

2018-03-14  本文已影响19人  VanChan

RunLoop回忆录

简介

运行循环, 能够保持程序运行, 处理app的各种事件, 节省CPU资源, 提高性能.

访问方法

CFRunLoopRef是c语言写的, 相比于NSRunLoop更加底层, 所以CFRunLoopRef的性能要更高一点.

RunLoop与线程

获取RunLoop对象

Foundation:

[NSRunLoop currentRunLoop]; // 获取当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获取主线程的RunLoop对象

Core Foundation:

CFRunLoopGetCurrent();
CFRunLoopGetMain();

RunLoop相关类

  1. 一个CFRunLoopModeRef代表的是RunLoop的运行模式
  2. 一个RunLoop包含若干个Mode, 每个Mode又包含若干个Source/Timer/Observer
  3. 每次调用RunLoop的主函数时, 只能指定其中一个Mode, 这个Mode被称作CurrentMode
  4. 如果需要切换Mode, 只能退出RunLoop, 再重新指定一个Mode进入, 这样做是为了分隔开不同组的Source/Timer/Observer, 让其互不影响

CFRunLoopModeRef

系统默认注册了4个mode

kCFRunLoopDefaultMode //App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode //界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响    UIInitializationRunLoopMode // 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode // 接受系统事件的内部 Mode,通常用不到
kCFRunLoopCommonModes //这是一个占位用的Mode,不是一种真正的Mode

CFRunLoopSourceRef

是事件源, 分为两种:

  1. source0: 非基于port的(port相当于是系统), 响应
  2. source1: 基于port的, 系统提供的

CFRunLoopObserverRef

是观察者, 可以监听RunLoop的状态改变监听的

RunLoop的应用

  1. performSelector
  2. 常驻线程
  3. NSTimer
  4. ImageVIew的显示, 第三方框架SDWebImage利用了RunLoop
  5. 自动释放池
上一篇下一篇

猜你喜欢

热点阅读