文章目录

  • 1. 基本作用
  • 2. RunLoop对象
  • 3. RunLoop与线程
    • 1. 获取runloop对象
    • 2. RunLoop相关的类
    • 3. CFRunLoopObserverRef
    • 4. runloop的运行逻辑
    • 5.runloop在实际开发中的应用
  • 定时器
  • runloop 流程

实际上是一个对象,这个对象提供一个入口函数,执行这个入口函数后,程序会进入一个do…while循环,不断的处理事件,节省cpu资源,提高利用率.
通过内部维护的事件循环来对事件/消息进行管理的一个对象

  • 没有消息需要处理时,休眠以避免资源占用
  • 有消息需要处理时,立刻被唤醒

1. 基本作用

  1. 保持程序的持续运行
  2. 处理App中的各种事件(触摸事件,定时器事件,performSelect)
  3. 节省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相关的类


  1. _pthread : 一个runloop对应一个_pthread线程.

  1. _modes : 一个runloop包含多个mode(默认模式,UI追踪模式,GSEventReceiveRunLoopMode)
  • 每个mode中又包含了若干个source/timer/observer
  • source/timer/observer 又叫做modeItem,不同mode下的modeitem互不影响

  1. _currentMode : 当前正在运行的模式,runloop只能运行在一种模式下. 如果要切换模式,退出当前正在运行的模式,然后重新定制的mode执行


  1. _commonModesItems : 加入NSRunLoopCommonModes模式下的对象会被放入这个集合中


  1. _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相关推荐

  1. 信息学奥赛一本通 1176:谁考了第k名 | OpenJudge NOI 1.10 01:谁考了第k名

    [题目链接] ybt 1176:谁考了第k名 OpenJudge NOI 1.10 01:谁考了第k名 [题目考点] 1. 结构体 排序 [君义精讲]排序算法 2. printf %g输出 为简洁输出 ...

  2. 面试题 10.01. 合并排序的数组

    面试题 10.01. 合并排序的数组 思路:①把B数组放在A数组后面,然后排序.O((n+m)²),太蠢了代码不写 ②copyA数组,然后两个指针判度copyA,和B的值那个小,小的放在A数组中,然后 ...

  3. 你需要立即停止的9个习惯! 2012-03-11 10:01:41

    http://site.douban.com/widget/notes/4591118/note/204497120/ 你需要立即停止的9个习惯! 2012-03-11 10:01:41   效率不高 ...

  4. mulesoft MCIA 破釜沉舟备考 2023.02.10.01

    mulesoft MCIA 破釜沉舟备考 2023.02.10.01 1. What is a defining charcateristic of an integration-Platform-a ...

  5. Leetcode面试题 10.01. 合并排序的数组(C语言)

    Leetcode面试题 10.01. 合并排序的数组(C语言) 题目: 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 ...

  6. CV学习笔记 | CV综述 [2020.10.01]

    文章目录 0. 概述(整理完后随时修改) 1. 人工神经网络 1.1. 人工神经网络发展历程 1.2. 一些神经元节点的工作原理 1.2.1. 基本神经元 1.2.2. 卷积神经元(Convoluti ...

  7. 10.01.05专题 “如何处理大项目中各个PM之间的沟通效率“

    huner_wang-PMO-北京 说 (12:03):  对了,我发起个主题如何?大家帮我分析下怎么样? 毳戥亳_.NET_上海 说 (12:03):  什么主题? chuner_wang-PMO- ...

  8. 18.10.01模拟赛总结

    毒瘤出题人JR搞来了三道DP...... T1 jr的电脑密码 jr.cpp/.c/.pas 题目描述: 趁着jr出去吃饭,某人打算机惨jr,但他惊奇地发现,jr电脑居然有密码!每次给出两个正整数n, ...

  9. 每天一记 10.01.27

    今天下班后进行了年会的彩排,每个节目都相当搞笑,非常高兴. 每天都在紧张的工作,带来点快乐氛围,悠哉悠哉! 甚是期待后天的年后! 转载于:https://blog.51cto.com/lml66666 ...

  10. Leetcode 面试题 10.01. 合并排序的数组 (每日一题 20210616)

    给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 A 和 B 的元素数量分别为 m 和 n.示例:输入: A = [1,2 ...

最新文章

  1. 我看过的C#方面的好文章
  2. SQL Loader 的使用详解
  3. springboot开启jms服务监控jvm运行情况
  4. Python 3.5.2建立与DB2的连接
  5. API信息全掌控,方便你的日志管理——阿里云推出API网关打通日志服务
  6. python 获取麦克风声音_如何使用python和ffmpeg或simi读取实时麦克风音频音量
  7. 在linux中 与 的区别,在linux中,和, |和|| , 与 的区别
  8. C语言逐行读取文件内容
  9. 自动人脸识别高颜值抖音小姐姐并点赞(python)
  10. 用 Tenorshare ReiBoot修复iPhone无法开机
  11. NLP学习03--递归神经网络RNN
  12. 计算平均成绩,科目数已知
  13. 基于jquery的web在线流程图设计器gooFlow
  14. TI am3352 gpio 驱动
  15. 自动化信任和依赖对航空安全的危害及其改进
  16. 部落卫队问题 (回溯)
  17. 六套苹果CMSv10首涂手机视频站模板高端主题代码精简优化SEO
  18. python try catch
  19. 解决电脑连上wifi无法上网问题
  20. gdb+linux+查看变量,gdb查看变量值

热门文章

  1. JavaScript--JQuery事件 当网页元素加载完成后再去执行事件
  2. vue组件之间数据传递和通信方式总结
  3. Qt按钮左边图片右边文字
  4. 互联网老辛2022年2月社群分享精华
  5. 七牛云王珂 直播分享 | 如何快速搭建智能化的统一日志管理系统
  6. 1426:智力大冲浪
  7. R绘图实战|GSEA富集分析图
  8. 《R语言实战笔记》第一章:R语言介绍
  9. Spoon/Kettle 连接sqlserver数据库遇到的问题 (亲测可用,图文讲解)
  10. DOM/伪DOM自定义事件