以下为主RunLoop 的输出,能够看到不同的source0,source1,observer

----------------------------------

CFRunLoop{wakeup port =, stopped = false, ignoreWakeUps = false, 
current mode = kCFRunLoopDefaultMode,
common modes

{
  <CFString 0x108f42000 [0x107bd39b0]>{contents = "UITrackingRunLoopMode"}
  <CFString 0x107ba9800 [0x107bd39b0]>{contents = "kCFRunLoopDefaultMode"}
}

common mode items 

(
   <CFRunLoopSource>{callout = PurpleEventSignalCallback}}
  <CFRunLoopObserver>{callout = _wrapRunLoopWithAutoreleasePoolHandler}
   <CFRunLoopSource>{callout = FBSSerialQueueRunLoopSourceHandler}}
  <CFRunLoopObserver>{callout = _beforeCACommitHandler}
  <CFRunLoopSource>{callout = __handleHIDEventFetcherDrain}}
  <CFRunLoopObserver>{callout = _wrapRunLoopWithAutoreleasePoolHandler}
  <CFRunLoopObserver>{callout = _afterCACommitHandler}
  <CFRunLoopObserver>{callout = _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv}
  <CFRunLoopSource>{callout = __handleEventQueue}
  <CFRunLoopObserver>{callout = _UIGestureRecognizerUpdateObserver}
  <CFRunLoopSource>{<CFRunLoopSource MIG Server> {port = 17927, subsystem = 0x108ef9998, context = 0x0}}
  <CFRunLoopSource>{callout = PurpleEventCallback}}
  <CFRunLoopSource>{callout = _ZL27change_notify_port_callbackP12__CFMachPortPvlS1_}
  <CFRunLoopTimer>{callout = _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv}
  <CFRunLoopSource>{<CFRunLoopSource MIG Server> {port = 22535, subsystem =, context =}}
  <CFRunLoopSource>{<CFRunLoopSource MIG Server> {port = 40455, subsystem =, context =}}

)

1) <CFRunLoopMode>{name = UITrackingRunLoopMode, port set = 0x1e07, queue =, source =, timer port = 0x2003}

sources0
(
  <CFRunLoopSource>{callout = PurpleEventSignalCallback}
  <CFRunLoopSource>{callout = __handleEventQueue}
  <CFRunLoopSource>{callout = __handleHIDEventFetcherDrain}
  <CFRunLoopSource>{callout = FBSSerialQueueRunLoopSourceHandler}
)

sources1
(
  <CFRunLoopSource>{<CFRunLoopSource MIG Server>}
  <CFRunLoopSource>{CFMachPort{callout = _ZL27change_notify_port_callbackP12__CFMachPortPvlS1_}}
  <CFRunLoopSource>{<CFRunLoopSource MIG Server>}
  <CFRunLoopSource>{<CFRunLoopSource MIG Server>}
  <CFRunLoopSource>{callout = PurpleEventCallback}
)

observers
(
    <CFRunLoopObserver>{activities = 0x1, repeats = Yes, callout = _wrapRunLoopWithAutoreleasePoolHandler}
    <CFRunLoopObserver>{activities = 0x20, repeats = Yes, callout = _UIGestureRecognizerUpdateObserver}
    <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _beforeCACommitHandler}
    <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv}
    <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _afterCACommitHandler}
    <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _wrapRunLoopWithAutoreleasePoolHandler}
)

timers
(
  <CFRunLoopTimer>{callout = _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv},
)

2) <CFRunLoopMode>{name = GSEventReceiveRunLoopMode, port set = 0x2d03, queue =, source =, timer port = 0x5303}

sources0
(
  <CFRunLoopSource>{callout = PurpleEventSignalCallback}
)

sources1
(
  <CFRunLoopSource>{callout = PurpleEventCallback}
)

3) <CFRunLoopMode>{name = kCFRunLoopDefaultMode, port set = 0x1b03, queue =, source =, timer port = 0x2503}

sources0
(
  <CFRunLoopSource>{callout = PurpleEventSignalCallback}
  <CFRunLoopSource>{callout = __handleEventQueue}
  <CFRunLoopSource>{callout = __handleHIDEventFetcherDrain}
  <CFRunLoopSource>{callout = FBSSerialQueueRunLoopSourceHandler}
)

sources1
(
  <CFRunLoopSource>{<CFRunLoopSource MIG Server> {port = 17927, subsystem =, context = 0x0}}
  <CFRunLoopSource>{callout = _ZL27change_notify_port_callbackP12__CFMachPortPvlS1_}
  <CFRunLoopSource>{<CFRunLoopSource MIG Server> {port = 22535, subsystem =, context =}}
  <CFRunLoopSource>{<CFRunLoopSource MIG Server> {port = 40455, subsystem =, context =}}
  <CFRunLoopSource>{callout = PurpleEventCallback}
)

observers
(
  <CFRunLoopObserver>{activities = 0x1, repeats = Yes, callout = _wrapRunLoopWithAutoreleasePoolHandler}
  <CFRunLoopObserver>{activities = 0x20, repeats = Yes, callout = _UIGestureRecognizerUpdateObserver}
  <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _beforeCACommitHandler}
  <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv}
  <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _afterCACommitHandler}
  <CFRunLoopObserver>{activities = 0xa0, repeats = Yes, callout = _wrapRunLoopWithAutoreleasePoolHandler
)

timers
(
  <CFRunLoopTimer>{callout = _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv}
)

4) <CFRunLoopMode]>{name = kCFRunLoopCommonModes, port set = 0x470f, queue =, source =, timer port = 0xa907}


  • 观察者

typedef enum CFRunLoopActivity : CFOptionFlags {
kCFRunLoopEntry = (1UL << 0),
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5),
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities = 0x0FFFFFFFU
} CFRunLoopActivity;
  • <<<<<<主线程RunLoop 用到的 Activity>>>>>>
0x01 == 00000001 ===>>> kCFRunLoopEntry
0x20 == 00100000 ===>>> kCFRunLoopBeforeWaiting
0xa0 == 10100000 ===>>> kCFRunLoopBeforeWaiting | kCFRunLoopExit

 

  • autorelease pool : _wrapRunLoopWithAutoreleasePoolHandler: 主消息循环在进入和等待或者退出注册了handler,来处理自动释放池
 

主线程 RunLoop 学习笔记的更多相关文章

  1. 我的runloop学习笔记

    前言:公司项目终于忙的差不多了,最近比较闲,想起叶大说过的iOS面试三把刀,GCD.runtime.runloop,runtime之前已经总结过了,GCD在另一篇博客里也做了一些小总结,今天准备把ru ...

  2. c++11 线程池学习笔记 (一) 任务队列

    学习内容来自一下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...

  3. c++11 线程池学习笔记 (二) 线程池

    学习内容来自以下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...

  4. Linux线程互斥学习笔记--详细分析

    一.互斥锁 为啥要有互斥? 多个进程/线程执行的先后顺序不确定,何时切出CPU也不确定. 多个进程/线程访问变量的动作往往不是原子的. 1. 操作步骤 (1)创建锁 // 创建互斥锁mutex pth ...

  5. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  6. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  7. Java内存模型与线程_学习笔记

    深入理解java虚拟机: 1.java内存模型 java虚拟机规范中试图定义一种Java内存模型.Java Memory Model(JMM) 1.1 主内存与工作内存 java内存模型规定所有的变量 ...

  8. ucore lab4 内核线程管理 学习笔记

    越学越简单,真是越学越简单啊 看视频的时候着实被那复杂的函数调用图吓到了.看代码的时候发现条理还是很清晰的,远没有没想象的那么复杂. 这节创建了俩内核线程,然后运行第一个线程,再由第一个切换到第二个. ...

  9. MySQL学习笔记-数据库后台线程

    数据库后台线程 默认情况下讲述的InnoDB存储引擎,以后不再重复声明.后台线程有7个--4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程.IO thread的 ...

随机推荐

  1. 基础知识-Mockjs进行数据模拟

    目录 1. 目标 2. 创建模拟数据服务器 3. 安装 mockjs, 熟悉 mockjs 语法 4. 设置代理,解决 vue 项目跨域问题 5. 设置响应头,解决无法获取获取 token 和 coo ...

  2. 【redis】-- springboot集成redis及使用

    springboot自动配置的redis并不是特别好用,所以需要我们使用原生的jedis, 1.添加依赖 2.在application文件中配置 # Redis服务器地址 redis.host= # ...

  3. BZOJ.2823.[AHOI2012]信号塔(最小圆覆盖 随机增量法)

    BZOJ 洛谷 一个经典的随机增量法,具体可以看这里,只记一下大体流程. 一个定理:如果一个点\(p\)不在点集\(S\)的最小覆盖圆内,那么它一定在\(S\bigcup p\)的最小覆盖圆上. 所以 ...

  4. 使用php的curl爬去青果教务系统 课表(转)

    1. 分析 首先我们要了解 Http Cookie 的作用(可参考HTTP cookies 详解),简单来说就是维持一个会话,这样我们就能在登陆一个网页后,就能进入这个网页需要登陆的界面. 现在我们需 ...

  5. 如何彻底卸载Jenkins

    起因: 最近在做持续集成测试过程中遇到一个问题,之前部署的Jenkins管理员密码忘了之后无法登陆,而且删除掉tomcat下webapps文件夹中的Jenkins目录后,再次安装Jenkins后相关的 ...

  6. 构建Dubbo-2.0.7源码

    一. 下载源码: git clone --branch dubbo-2.0.7 https://github.com/apache/incubator-dubbo.git 二. 下载依赖 git cl ...

  7. scheduling while atomic和bad: scheduling from the idle thread(转)

    https://blog.csdn.net/shanzhizi/article/details/22949121 https://blog.csdn.net/wwwtovvv/article/deta ...

  8. LeetCode 240 - 搜索二维矩阵 II

    编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列.每列的元素从上到下升序排列.示例: 现有矩阵 matrix 如 ...

  9. Codeforces Round #542 题解

    Codeforces Round #542 abstract I决策中的独立性, II联通块染色板子 IIIVoronoi diagram O(N^2 logN) VI环上距离分类讨论加取模,最值中的 ...

  10. Head First Python-Python中与文件相关的操作-读、处理、写

    最近在看head first python,前面也写了一些笔记,但是基本上没有涉及到一些完整的代码,现在将书中的文件相关操作的代码整理,供以后参考. 主要分为两大部分,读取文件.处理异常,处理文件.存 ...