iOS_RunLoop简介

RunLoop资料: 1. 苹果官方文档 2. CFRunLoopRef开源文档

1.什么是RunLoop

  • 简单从字面意思进行中文解释就是 运行循环
    main函数中就有一个RunLoop int main(int argc, char * argv[]) {
    @autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
    UIApplicationMain函数内部就启动了一个RunLoop,所以UIApplicationMain函数一直没有返回,保持了程序的持续运行
    这个默认启动的RunLoop是跟主线程相关联的
  • 基本作用
    1. 保持程序的持续运行
    2. 节省CPU资源,提高程序性能
    3. 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)
    4. ......

2.RunLoop对象如何调用

NSRunLoop和CFRunLoopRef都代表着RunLoop对象
NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)

1. Core Foundation:
       CFRunLoopGetCurrent();// 获得当前线程的RunLoop对象
       CFRunLoopGetMain();   // 获得主线程的RunLoop对象
 1. CFRunLoopRef  
 2. CFRunLoopModeRef    {
         CFRunLoopModeRef代表RunLoop的运行模式
         1. 一个 RunLoop包含若干个 Mode,每个Mode又包含若干个Source/Timer/Observer
         2. 每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode
         3. 如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入
         4. 这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响     
         }
         系统默认注册了5个Mode:  {
         1. kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
         2. UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode 影响
         3. GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到
         4. UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用
         5. kCFRunLoopCommonModes: 这是一个占位用的Mode,不是一种真正的Mode
         }
 3. CFRunLoopSourceRef
     CFRunLoopSourceRef是事件源(输入源)
          以前的分法
          Port-BasedSources
          Custom InputSources
          Cocoa PerformSelector Sources   
          现在的分法
          Source0:非基于Port的
          Source1:基于Port的
 4. CFRunLoopTimerRef
          CFRunLoopTimerRef是基于时间的触发器
          基本上说的就是NSTimer
 5. CFRunLoopObserverRef
          CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
          可以监听的时间点有以下几个
1.png
2. Foundation:NSRunLoop
        [NSRunLoopcurrentRunLoop];// 获得当前线程的RunLoop对象
        [NSRunLoopmainRunLoop];   // 获得主线程的RunLoop对象
**3. RunLoop与线程 **
         1.每条线程都有唯一的一个与之对应的RunLoop对象
         2.主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建
         3.RunLoop在第一次获取时创建,在线程结束时销毁

3.RunLoop逻辑处理

1.官方
2.png
2.网络
4.png

3.png

4.RunLoop应用

         1. NSTimer
         2. ImageView显示
         3. PerformSelector
         4. 常驻线程
         5. 自动释放池

5.RunLoop简单定时器实践

屏幕快照 2016-08-04 18.05.38.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容