iOS学习笔记-133.RunLoop01——基础知识
来源:互联网 发布:阿里移动推荐算法总结 编辑:程序博客网 时间:2024/05/22 06:45
- RunLoop01基础知识
- 一简介
- 1 什么是RunLoop
- 2 基本作用
- 3 如果没有RunLoop
- 4 如果有了RunLoop
- 5 main函数中的RunLoop
- 6 重要说明
- 二RunLoop对象
- 三获得RunLoop对象
- 1 Foundation
- 2 Core Foundation
- 四RunLoop资料
- 1 苹果官方文档
- 2 CFRunLoop源码
- 一简介
RunLoop01——基础知识
一、简介
1.1 什么是RunLoop
从字面意思看
运行循环 跑圈
1.2 基本作用
保持程序的持续运行处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)节省CPU资源,提高程序性能:该做事时做事,该休息时休息......
1.3 如果没有RunLoop
没有RunLoop的情况下
第3行后程序就结束了
1.4 如果有了RunLoop
有RunLoop的情况下
由于main函数里面启动了个RunLoop,所以程序并不会马上退出,保持持续运行状态
1.5 main函数中的RunLoop
//// main.m// 03_UIView91_NSRunLoop简单运用//// Created by 杞文明 on 17/9/10.// Copyright © 2017年 杞文明. All rights reserved.//#import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
第14行代码的UIApplicationMain函数内部就启动了一个RunLoop
所以UIApplicationMain函数一直没有返回,保持了程序的持续运行
这个默认启动的RunLoop是跟主线程相关联的
1.6 重要说明
(1)如果没有Runloop,那么程序一启动就会退出,什么事情都做不了。(2)如果有了Runloop,那么相当于在内部有一个死循环,能够保证程序的持续运行(3)main函数中的Runloop a 在UIApplication函数内部就启动了一个Runloop 该函数返回一个int类型的值 b 这个默认启动的Runloop是跟主线程相关联的
二、RunLoop对象
(1)在iOS开发中有两套api来访问Runloop
a.foundation框架【NSRunloop】
b.core foundation框架【CFRunloopRef】
(2)NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换
(3)NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)
三、获得RunLoop对象
3.1 Foundation
// 获得当前线程的RunLoop对象[NSRunLoop currentRunLoop]; // 获得主线程的RunLoop对象[NSRunLoop mainRunLoop];
3.2 Core Foundation
// 获得当前线程的RunLoop对象CFRunLoopGetCurrent(); // 获得主线程的RunLoop对象CFRunLoopGetMain(); ````<div class="se-preview-section-delimiter"></div>### 3.3 总结1.获得当前Runloop对象<div class="se-preview-section-delimiter"></div>
//01 NSRunloop
NSRunLoop * runloop1 = [NSRunLoop currentRunLoop];
//02 CFRunLoopRef
CFRunLoopRef runloop2 = CFRunLoopGetCurrent();
2.拿到当前应用程序的主Runloop(主线程对应的Runloop)<div class="se-preview-section-delimiter"></div>
//01 NSRunloop
NSRunLoop * runloop1 = [NSRunLoop mainRunLoop];
//02 CFRunLoopRef
CFRunLoopRef runloop2 = CFRunLoopGetMain();
“`
3.注意点:开一个子线程创建runloop,不是通过alloc init方法创建,
而是直接通过调用currentRunLoop
方法来创建,它本身是一个懒加载的。
4.主线程的runloop已经创建,但是子线程的需要手动创建.
在子线程中,如果不主动获取Runloop的话,那么子线程内部是不会创建Runloop的。
可以下载CFRunloopRef的源码,搜索_CFRunloopGet0,查看代码。
5.Runloop对象是利用字典来进行存储,而且key是对应的线程Value为该线程对应的Runloop。
四、RunLoop资料
4.1 苹果官方文档
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
4.2 CFRunLoop源码
CFRunLoopRef是开源的
https://opensource.apple.com/source/CF/
- iOS学习笔记-133.RunLoop01——基础知识
- 《HTML5学习笔记—基础知识》
- Spring学习笔记—基础知识
- ios学习笔记(一)基础知识
- IOS开发-Swift-基础知识学习笔记
- C++学习笔记——基础知识
- Struts2学习笔记1——基础知识
- Spring学习笔记1——基础知识
- Spring学习笔记1——基础知识 .
- Spring学习笔记1——基础知识
- Spring学习笔记1——基础知识
- java学习笔记——基础知识
- Spring学习笔记1——基础知识
- Spring学习笔记1——基础知识
- Python学习笔记——基础知识
- Spring学习笔记1——基础知识
- X86学习笔记——汇编基础知识
- Spring学习笔记——基础知识
- 数袋鼠好有趣
- 在CentOS7下将nginx添加到systemctl
- 基础代码-维护图的连通性
- C++连接Mysql
- Makefile基础教程 10
- iOS学习笔记-133.RunLoop01——基础知识
- HDU 6201 transaction transaction transaction(树上dfs/费用流)
- 洛谷 P1967 货车运输(Kruskal最大生成树&&倍增lca)
- hadoop初识之十一:mapreduce编写格式与示例, 并在yarn上运行
- ICPC2017网络赛(沈阳)1008&HDU6201transaction(spfa 费用流)
- Maven 中使用本地 jar 包
- git如何配置ssh
- Qt-Widget窗体无法最大化问题解决
- 关于项目在IIS中启动后报handlers红色错误的解决方案