RunLoop回忆录

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
  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. 自动释放池
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling阅读 5,309评论 0 13
  • RunLoop 的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线...
    Mirsiter_魏阅读 3,770评论 0 2
  • RunLoop的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程...
    IOS学渣阅读 3,229评论 1 4
  • http://www.cocoachina.com/ios/20150601/11970.html RunLoop...
    紫色冰雨阅读 4,318评论 0 3
  • 近一段时间来,有关校园欺凌的报道频频见诸报端.,有的甚至触犯刑法,这对建设和谐校园产生了严重影响。那么,家长如何教...
    教育杂谈阅读 3,564评论 0 0