10.01-runloop
文章目录
- 1. 基本作用
- 2. RunLoop对象
- 3. RunLoop与线程
- 1. 获取runloop对象
- 2. RunLoop相关的类
- 3. CFRunLoopObserverRef
- 4. runloop的运行逻辑
- 5.runloop在实际开发中的应用
- 定时器
- runloop 流程
实际上是一个对象,这个对象提供一个入口函数,执行这个入口函数后,程序会进入一个do…while循环,不断的处理事件,节省cpu资源,提高利用率.
通过内部维护的事件循环来对事件/消息进行管理的一个对象
- 没有消息需要处理时,休眠以避免资源占用
- 有消息需要处理时,立刻被唤醒
1. 基本作用
- 保持程序的持续运行
- 处理App中的各种事件(触摸事件,定时器事件,performSelect)
- 节省CPU资源,提高程序性能(该做事的时候做事,该休息的时候休息)
2. RunLoop对象
Foundation : NSRunLoop
Core Foundation : CFRunLoopRef
NSRunLoop 和 CFRunLoopRef都代表着RunLoop对象
NSRunLoop是基于CFRunLoopRef的一层OC包装
3. RunLoop与线程
- 每条线程都有一个唯一的一个与之对应的RunLoop对象
- RunLoop保存在一个全局的Dictionary里,线程为key, RunLoop为value
- 线程刚刚创建的时候,并没有RunLoo对象,RunLoop会在第一次获取它的时候创建
- RunLoop会在线程结束时销毁
- 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop
1. 获取runloop对象
// Foundation[NSRunLoop currentRunLoop];//获取当前线程的runloop[NSRunLoop mainRunLoop];//获取主线程的runloop// Core FoundationCFRunLoopGetCurrent();//获取当前线程的runloopCFRunLoopGetMain();//获取主线程的runloop
2. RunLoop相关的类
- _pthread : 一个runloop对应一个_pthread线程.
- _modes : 一个runloop包含多个mode(默认模式,UI追踪模式,GSEventReceiveRunLoopMode)
- 每个mode中又包含了若干个source/timer/observer
- source/timer/observer 又叫做modeItem,不同mode下的modeitem互不影响
- _currentMode : 当前正在运行的模式,runloop只能运行在一种模式下. 如果要切换模式,退出当前正在运行的模式,然后重新定制的mode执行
- _commonModesItems : 加入NSRunLoopCommonModes模式下的对象会被放入这个集合中
- _commonModes : 里面包含了默认模式 和UI追踪模式
- 如果mode中没有任何source0/source1/observer , runloop会立马退出
3. CFRunLoopObserverRef
- 添加Observer监听RunLoop的所有状态
// CFRunLoopObserverCreate(<#CFAllocatorRef allocator#>, <#CFOptionFlags activities#>, <#Boolean repeats#>, <#CFIndex order#>, <#CFRunLoopObserverCallBack callout#>, <#CFRunLoopObserverContext *context#>)
//CFRunLoopObserverContext 是一个结构体//创建observerCFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, observerCallBack, NULL);//添加observerCFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopDefaultMode);//通过create copy得到的, 最后都需要释放CFRelease(observer);
4. runloop的运行逻辑
- source0
触摸事件处理 , P而formSelector:onThread:- source1
一般处理系统的事件- Timer
NSTimer , performSelector:withObject:afterDelay:- Observers
用于监听runloop的状态
UI刷新(beforewaiting)
autorelease pool (beforewaiting)
5.runloop在实际开发中的应用
- 控制线程生命周期
- 解决NSTimer在滑动时停止工作的问题
- 监控应用卡顿
- 性能优化
定时器
要想定时器在UI滑动的时候也不会停止工作
[[NSRunLoop currentRunLoop] addTimer:time forMode:NSRunLoopCommonModes];CFRunLoopAddTimer(<#CFRunLoopRef rl#>, <#CFRunLoopTimerRef timer#>, <#CFRunLoopMode mode#>)
把定时器加入了 _commonModeItems , (加入了默认模式,和UI追踪模式)
__CFRunLoopAddItemToCommonModes : 把timer添加到每一个mode中
runloop 流程
10.01-runloop相关推荐
- 信息学奥赛一本通 1176:谁考了第k名 | OpenJudge NOI 1.10 01:谁考了第k名
[题目链接] ybt 1176:谁考了第k名 OpenJudge NOI 1.10 01:谁考了第k名 [题目考点] 1. 结构体 排序 [君义精讲]排序算法 2. printf %g输出 为简洁输出 ...
- 面试题 10.01. 合并排序的数组
面试题 10.01. 合并排序的数组 思路:①把B数组放在A数组后面,然后排序.O((n+m)²),太蠢了代码不写 ②copyA数组,然后两个指针判度copyA,和B的值那个小,小的放在A数组中,然后 ...
- 你需要立即停止的9个习惯! 2012-03-11 10:01:41
http://site.douban.com/widget/notes/4591118/note/204497120/ 你需要立即停止的9个习惯! 2012-03-11 10:01:41 效率不高 ...
- mulesoft MCIA 破釜沉舟备考 2023.02.10.01
mulesoft MCIA 破釜沉舟备考 2023.02.10.01 1. What is a defining charcateristic of an integration-Platform-a ...
- Leetcode面试题 10.01. 合并排序的数组(C语言)
Leetcode面试题 10.01. 合并排序的数组(C语言) 题目: 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 ...
- CV学习笔记 | CV综述 [2020.10.01]
文章目录 0. 概述(整理完后随时修改) 1. 人工神经网络 1.1. 人工神经网络发展历程 1.2. 一些神经元节点的工作原理 1.2.1. 基本神经元 1.2.2. 卷积神经元(Convoluti ...
- 10.01.05专题 “如何处理大项目中各个PM之间的沟通效率“
huner_wang-PMO-北京 说 (12:03): 对了,我发起个主题如何?大家帮我分析下怎么样? 毳戥亳_.NET_上海 说 (12:03): 什么主题? chuner_wang-PMO- ...
- 18.10.01模拟赛总结
毒瘤出题人JR搞来了三道DP...... T1 jr的电脑密码 jr.cpp/.c/.pas 题目描述: 趁着jr出去吃饭,某人打算机惨jr,但他惊奇地发现,jr电脑居然有密码!每次给出两个正整数n, ...
- 每天一记 10.01.27
今天下班后进行了年会的彩排,每个节目都相当搞笑,非常高兴. 每天都在紧张的工作,带来点快乐氛围,悠哉悠哉! 甚是期待后天的年后! 转载于:https://blog.51cto.com/lml66666 ...
- Leetcode 面试题 10.01. 合并排序的数组 (每日一题 20210616)
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 A 和 B 的元素数量分别为 m 和 n.示例:输入: A = [1,2 ...
最新文章
- 我看过的C#方面的好文章
- SQL Loader 的使用详解
- springboot开启jms服务监控jvm运行情况
- Python 3.5.2建立与DB2的连接
- API信息全掌控,方便你的日志管理——阿里云推出API网关打通日志服务
- python 获取麦克风声音_如何使用python和ffmpeg或simi读取实时麦克风音频音量
- 在linux中 与 的区别,在linux中,和, |和|| , 与 的区别
- C语言逐行读取文件内容
- 自动人脸识别高颜值抖音小姐姐并点赞(python)
- 用 Tenorshare ReiBoot修复iPhone无法开机
- NLP学习03--递归神经网络RNN
- 计算平均成绩,科目数已知
- 基于jquery的web在线流程图设计器gooFlow
- TI am3352 gpio 驱动
- 自动化信任和依赖对航空安全的危害及其改进
- 部落卫队问题 (回溯)
- 六套苹果CMSv10首涂手机视频站模板高端主题代码精简优化SEO
- python try catch
- 解决电脑连上wifi无法上网问题
- gdb+linux+查看变量,gdb查看变量值