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,才能实现滚动界面的时候不会影响到轮播器的滚动,就是这个原因。

RunLoop相关知识的总结的更多相关文章

  1. RunLoop相关知识

    RunLoop,翻译过来是运行环路.我们在创建命令行项目和创建ios项目时,发现命令行项目当最后一行代码执行完后项目就自动退出了,而ios项目确可以一直运行,知道用户手动点击退出按钮.这就是因为ios ...

  2. Runloop基础知识

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  4. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  5. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  6. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  7. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  8. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  9. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

随机推荐

  1. 使用 CoordinatorLayout 实现复杂联动效果

    GitHub 地址已更新: unixzii / android-FancyBehaviorDemo CoordinatorLayout 是 Google 在 Design Support 包中提供的一 ...

  2. node07-http

    目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-exp ...

  3. Servlet 单例多线程

    Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在 ...

  4. 【康拓展开】及其在求全排列第k个数中的应用

    题目:给出n个互不相同的字符, 并给定它们的相对大小顺序,这样n个字符的所有排列也会有一个顺序. 现在任给一个排列,求出在它后面的第i个排列.这是一个典型的康拓展开应用,首先我们先阐述一下什么是康拓展 ...

  5. Intel VT入门

    前言     传说中的VT貌似很神秘的样子,关于VT入门的资料又很少,于是研究了一番 由于资源有限,自身水平亦有限,并且是闭门造车之作,如有错误的地方请指正,不胜感激! 关于VT可以先参考海风月影写的 ...

  6. oj Rapid Typing

    import bs4 import requests import urllib2 import time import base64 session=requests.Session() respo ...

  7. LINUX 查看当前系统的负载情况

    uptime linux uptime命令主要用于获取主机运行时间和查询linux系统负载等信息. eg: # uptime 02:03:50 up 126 days, 12:57, 2 users, ...

  8. 【BZOJ3669】[Noi2014]魔法森林 LCT

    终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...

  9. winform中的确定取消

    ~~~~~~~~~~~ 今天也是醉了,做的项目找了很多地方也没有找到为什么点击确定取消,form会关闭(还是脑子不活) 加了一个小功能,代码没有什么难的但是,就是碰见了这么一个问题 点击  确定  取 ...

  10. C 符号

    语言的运算符可分为以下几类: 1 算术运算符 用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(–)共七种. 2.关系运算符 用于比较运算.包括 ...