RunLoop 即运行循环,也叫事件循环,本质为一个死循环。iOS一个程序运行起来之后,默认会开启一个运行循环,有需要处理的操作时,比如用户的输入事件时,RunLoop会自己跑起来运行,没有需要处理的事件时进入休息休眠的状态,充分节省CPU资源,提高程序的性能。

一、RunLoop的作用:

1.保证程序运行不退出,准确的说是保证线程的不退出,一般一个线程对应一个RunLoop。一个线程的任务执行完毕之后,就会退出,有时候我们需要一个线程随时待命,保持运行的状态不会退出,例如主线程,这就需要RunLoop这样的机制来完成这样的任务。

RunLoop实际上只是一个对象,只是给我们提供了一个函数的入口来执行RunLoop的逻辑。

2.处理app的各种事件:包括输入源和定时源,处理的顺序遵循先进先出的队列顺序。

3.节省CPU资源,优化程序:当没有事件可处理的时候,RunLoop会通知系统,现在没有事情要处理了,可以休息了,系统可以节省出资源去做其他的事情,当有事件要处理的时候,RunLoop立刻运行起来进行处理。

二、RunLoop与线程的关系:

1.一条线程都有与之对应的唯一的RunLoop的对象。

2.RunLoop在第一次获取时创建,在线程运行结束后销毁,只有在线程内部获取到该线程的RunLoop(主线程除外)。

3.主线程的RunLoop自动开启,子线程的RunLoop需要手动开启。

在我们平时建立项目的时候,其实已将使用了RunLoop,程序的启动入口:


2
3
4
5
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

UIApplicationMain函数内部就是启动了主线程的RunLoop。

4.RunLoop其实就是用来管理线程的,可以说,没有线程,就没有RunLoop存在的必要,在RunLoop一旦开启之后,就会对线程进行管理操作,在线程执行完任务后,线程便会进入休眠状态,并且不会退出,随时等待新的任务。

5.我们可以通过以下的代码获取主线程和当前线程RunLoop.

[NSRunLoop currentRunLoop];         [NSRunLoop mainRunLoop];

三、RunLoop的几种mode:

基本上有五种形式的mode,有的是苹果内部使用,我们实际开发中用不到:

1、kCFRunLoopDefaultMode 默认模式,通常主线程在这个模式下运行

 
2、UITrackingRunLoopMode 界面跟踪Mode,用于追踪Scrollview触摸滑动时的状态。
 
3、kCFRunLoopCommonModes 占位符,带有Common标记的字符串,比较特殊的一个mode;
 
4、UIInitializationRunLoopMode:刚启动App时进入的第一个Mode,启动后不在使用。
 
5、GSEventReceiveRunLoop:内部Mode,接收系事件

其中,NSRunLoopCommonModes等效于NSDefaultRunLoopModeNSEventTrackingRunLoopMode两种模式的结合
需要注意的是:RunLoop每次只能指定一种Mode。而且如果需要切换 Mode,只能退出当前 Loop。所以一般我们见到的定时器实现无线轮播功能的时候,需要将定时器加入到RunLoop的模式改为NSRunLoopCommonModes,才能实现滚动界面的时候不会影响到轮播器的滚动,就是这个原因。

最新文章

  1. PHP无限极分类
  2. Init
  3. 【java基础学习一】int[]、Integer[]、String[] 排序( 正序、倒叙)、去重
  4. UVa 10954 (Huffman 优先队列) Add All
  5. lintcode: 把排序数组转换为高度最小的二叉搜索树
  6. 【python之路7】python基本数据类型(一)
  7. (原创滴~)STL源码剖析读书总结1——GP和内存管理
  8. CSS 3 属性学习 —— 2. RGBA
  9. NSOperation 的使用(下载相关) 图片和文件都是能够的 断点续传 图片逐渐显示
  10. 从零开始学习前端开发 — 2、CSS基础
  11. Django+xadmin打造在线教育平台(四)
  12. Unity UGUI基础之Button
  13. java-包装类
  14. iOS: 并发编程的几个知识点
  15. SpringJMS解析--监听器
  16. docker测试时候命令无法补全的解决方法_docker
  17. (Gorails) activeStore模块,把一堆属性放在一个hash对象内。gem 'activerecord-typedstore'增强了store模块,更好用了
  18. http访问tomcat server的一个流程
  19. Java中线程的实现
  20. hdu-2620 Ice Rain---数论(取模运算规律)

热门文章

  1. C#反射机制 (转载)
  2. Jquery 实现点击tab切换页签
  3. 64位win7下安装SQL Server 2008(图文解说版)
  4. python备忘--函数
  5. ****CI框架源码阅读笔记7 配置管理组件 Config.php
  6. Windows 10 使用C#如何将IE设置为默认浏览器
  7. 你不知道的parseInt
  8. C++中随机数和不重复的随机数
  9. JavaScript老梗之this对象
  10. 一个列子演示vs2010 c++新特性