iOS RunLoop
来源:互联网 发布:苏州慧博网络是坑吗 编辑:程序博客网 时间:2024/06/05 00:58
一.RunLoop基本概念
概念:程序的运行循环,通俗的来说就是跑圈.
1. 基本作用(作用重大)
(1) 保持程序的持续运行(ios程序为什么能一直活着不会死)
(2) 处理app中的各种事件(比如触摸事件、定时器事件【NSTimer】、selector事件【选择器·performSelector···】)
(3)节省CPU资源,提高程序性能,有事情就做事情,没事情就休息
2. 重要说明
(1)如果没有Runloop,那么程序一启动就会退出,什么事情都做不了。
(2)如果有了Runloop,那么相当于在内部有一个死循环,能够保证程序的持续运行
3.main函数中的Runloop
(1) 在UIApplication函数内部就启动了一个Runloop,该函数返回一个int类型的值
(2) 这个默认启动的Runloop是跟主线程相关联的
4.Runloop对象
(1)在iOS开发中有两套api来访问Runloop
第一种:foundation框架【NSRunloop】
第二种:core foundation框架【CFRunloopRef】
(2)NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换
(3)NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)
(1) Runloop和线程的关系:一个Runloop对应着一条唯一的线程
问题:如何让子线程不死
回答:给这条子线程开启一个Runloop
(2) Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建
(3) Runloop的生命周期:在第一次获取时创建,在线程结束时销毁
(4) 拿到当前应用程序的主Runloop(主线程对应的Runloop)
NSRunLoop *mainLoop = [NSRunLoopmainRunLoop];
CFRunLoopRef *mainLoop =CFRunLoopGetMain();
RunLoop五个相关的类
- CFRunloopRef
- CFRunloopModeRef【Runloop的运行模式】
- CFRunloopSourceRef【Runloop要处理的事件源】
- CFRunloopTimerRef【Timer事件】
CFRunloopObserverRef【Runloop的观察者(监听者)】
以下是五个相关类的抛析:
(1) CFRunloopModeRef代表着Runloop的运行模式
(2) 一个Runloop中可以有多个mode,一个mode里面又可以有多个source\observer\timer等等
(3) 每次runloop启动的时候,只能指定一个mode,这个mode被称为该Runloop的当前mode
(4) 如果需要切换mode,只能先退出当前Runloop,再重新指定一个mode进入
(5) 这样做主要是为了分割不同组的定时器等,让他们相互之间不受影响
(6) 系统默认注册了5个mode
第一种模式: kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
第二种模式: UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
第四种模式: GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到
第五种模式: kCFRunLoopCommonModes: 这是一个占位用的Mode,不是一种真正的Mode
CFRunloopTimerRef
(1) runloop一启动就会选中一种模式,当选中了一种模式之后其它的模式就不会参与。一个mode里面可以添加多个NSTimer,也就是说以后当创建NSTimer的时候,可以指定它是在什么模式下运行的。
(2) 它是基于时间的触发器,说直白点那就是时间到了我就触发一个事件,触发一个操作。基本上说的就是NSTimer .
(3) 相关代码 / - (void)timer2 { //NSTimer 调用了scheduledTimer方法,那么会自动添加到当前的runloop里面去,而且runloop的运行模式kCFRunLoopDefaultMode
- iOS runloop
- iOS runloop
- iOS RunLoop
- iOS runloop
- <iOS>RunLoop
- iOS RUNLOOP
- iOS Runloop
- iOS - RunLoop
- iOS runloop
- iOS--Runloop
- iOS runloop
- iOS - RunLoop
- iOS RunLoop
- iOS RunLoop
- iOS RunLoop
- RunLoop-iOS
- ios-Runloop
- iOS RunLoop
- UIView生命周期
- Android Studio中R文件丢失的解决办法
- 操作MAC地址
- 简单SQL语句
- JSON对象与JSON字符串相互转换
- iOS RunLoop
- Java read bson file
- QT设置单元格格式
- 阿里云 使用镜像mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 使用镜
- 题目1113:二叉树
- 数据库中定义触发器实现:从多张表随机抽取数据组合成一张新表
- redis简单了解和使用
- kettle7.0下实现数据库整体迁移
- shlwapi常用的操作路径函数