RunLoop相关知识的总结
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 默认模式,通常主线程在这个模式下运行
其中,NSRunLoopCommonModes等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode两种模式的结合
需要注意的是:RunLoop每次只能指定一种Mode。而且如果需要切换 Mode,只能退出当前 Loop。所以一般我们见到的定时器实现无线轮播功能的时候,需要将定时器加入到RunLoop的模式改为NSRunLoopCommonModes,才能实现滚动界面的时候不会影响到轮播器的滚动,就是这个原因。
RunLoop相关知识的总结的更多相关文章
- RunLoop相关知识
RunLoop,翻译过来是运行环路.我们在创建命令行项目和创建ios项目时,发现命令行项目当最后一行代码执行完后项目就自动退出了,而ios项目确可以一直运行,知道用户手动点击退出按钮.这就是因为ios ...
- Runloop基础知识
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- 移动WEB像素相关知识
了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
- UIViewController相关知识
title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...
- 【转】java NIO 相关知识
原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...
- NSString使用stringWithFormat拼接的相关知识
NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...
- iOS网络相关知识总结
iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...
随机推荐
- i春秋手动病毒查杀
1:查看系统进程程 tasklist命令 2:当任务管理器无法打开的时候可以利用 taskkill /f /im [程序所显示的pid] 两个参数的意思分别是强制和程序在内存中的印象 3:ms ...
- SpringMVC拦截器
springmvc的拦截器 需求:进行用户的访问控制,判断用户是否登陆,如果登陆进行正常访问,如果没有登陆跳转到登陆页面. 1自定义拦截器类 package org.guangsoft.utils; ...
- Java集合框架实现自定义排序
Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...
- IOC装配Bean(XML方式)
Spring框架Bean实例化的方式 提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 无参数构造方法的实例化 <!-- 默认情况下使用的就是 ...
- BurpSuite设置公共WIFI抓包
1.电脑连接公共WIFI
- nodejs review-02
30 Receive POST data POST接受JSON数据处理; //req. res都是可读的stream; http.createServer(function (req, res) { ...
- Spring Bean后处理器以及容器后处理器【转】
Bean后处理器:即当spring容器实例化Bean实例之后进行的增强处理. 容器后处理器:对容器本身进行处理,并总是在容器实例化其他任何Bean之前读取配置文件的元数据并可能修改这些数据. 一.Be ...
- Leetcode Simplify Path
Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...
- db2无法force掉备份连接的处理办法
在数据库在线备份的时候会与Load和ALTER TABLE <表名> ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE发生冲突导致这两种操作被挂 ...
- js模块化方案【转】
(function(){ var CENTER = new EvtCenter(); var Loaded={}; var Modules={}; function loadScript(name,u ...