RunLoop回忆录
简介
运行循环, 能够保持程序运行, 处理app的各种事件, 节省CPU资源, 提高性能.
访问方法
- NSRunLoop
- CFRunLoopRef
CFRunLoopRef是c语言写的, 相比于NSRunLoop更加底层, 所以CFRunLoopRef的性能要更高一点.
RunLoop与线程
- 每条线程都有唯一的与之对应的RunLoop对象.
- 主线程的RunLoop已经创建好了, 而子线程的需要手动创建.
- RunLoop在第一次获取时创建, 在线程结束时销毁.
获取RunLoop对象
Foundation:
[NSRunLoop currentRunLoop]; // 获取当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获取主线程的RunLoop对象
Core Foundation:
CFRunLoopGetCurrent();
CFRunLoopGetMain();
RunLoop相关类
- CFRunLoopRef
- CFRunLoopModeRef
- CFRunLoopSourceRef
- CFRunLoopTimerRef
- CFRunLoopObserverRef
- 一个CFRunLoopModeRef代表的是RunLoop的运行模式
- 一个RunLoop包含若干个Mode, 每个Mode又包含若干个Source/Timer/Observer
- 每次调用RunLoop的主函数时, 只能指定其中一个Mode, 这个Mode被称作CurrentMode
- 如果需要切换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
是事件源, 分为两种:
- source0: 非基于port的(port相当于是系统), 响应
- source1: 基于port的, 系统提供的
CFRunLoopObserverRef
是观察者, 可以监听RunLoop的状态改变监听的
RunLoop的应用
- performSelector
- 常驻线程
- NSTimer
- ImageVIew的显示, 第三方框架SDWebImage利用了RunLoop
- 自动释放池
网友评论