2016 - 1 - 20 runloop学习

一:Runloop基本知识

1.本质就是运行循环

2.基本作用:

2.1保证程序持续运行

2.2处理APP中的各种事件:触摸,定时器,selector...

2.3节省CPU资源,系统程序性能:它会让主线程在工作时工作,非工作时休息。

2.4....

二:main函数中的Runloop

1.

1 int main(int argc, char * argv[]) {
2     @autoreleasepool {
3         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
4     }
5 }

2.第三行中的UIApplicationMain函数内部就启动了一个Runloop.

也就说,UIApplicationMain函数一直没有返回,保证了程序的持续运行。

3.这个启动的Runloop启动后默认是和主线程相关联的。

三:Runloop对象:

iOS中有两套API来冯访问Runloop对象

1.Foundation(ObjC) ----- NSRunloop

NSRunloop 其实就是 CFRunloopRef基于OC的包装对象。

2.Core Foundation -------CFRunloopRef

四:Runloop与线程

1.每一个线程都有唯一一个RunLoop对象

2.主线程的RunLoop是创建好的,子线程的需要主动创建

3.RunLoop在第一次获取时创建,在线程结束时销毁

五:获得RunLoop对象

1.RunLoop对象都是采用懒加载的模式来创建的,即获取时才会创建

2.Foundation框架中的NSRunLoop对象创建:

    [NSRunLoop mainRunLoop];  //获得主线程的RunLoop对象。

    [NSRunLoop currentRunLoop];// 获得当前线程的RunLoop对象,需要注意的是,如果新开辟了线程而没有调用此方法时,当前子线程的RunLoop对象是没有被创建的。

3.Core Foundation框架中的CFRunLoopRef对象创建:

    CFRunLoopGetCurrent();// 获得当前线程的RunLoop对象。

    CFRunLoopGetMain();  // 获得主线程的RunLoop对象。

4.可以在苹果官方的源码中看出,RunLoop与对应的线程是存在字典中的,key就是对应的线程。

六:RunLoop相关类

1.Core Foundation中关于RunLoop的五个类

1.1CFRunLoopRef

1.2CFRunLoopModeRef

1.3CFRunLoopSourceRef

1.4CFRunLoopTimerRef

1.5CFRunLoopObserverRef

2.关系如图:

需要注意的是,如果RunLoop中没有这些类,它将直接被销毁。

时间: 2024-12-10 10:47:20

2016 - 1 - 20 runloop学习的相关文章

2016 - 1 - 20 runloop学习(2)

一:CFRunLoopModeRef 1. CFRunLoopModeRef带表RunLoop的运行模式 2. 一个Runloop可以有若干个mode,每个mode又包含若干个sourse,timer,observer 3. 每当RunLoop启动时,只能指定其中一个mode,这个Mode被称为CurrentMode [[NSRunLoop currentRunLoop].currentMode 如果需要切换Mode,只能退出Runloop,再重新指定一个Mode来运行.这样做的目的就是为了分割

2016年5月份学习记录

                             2016年5月份学习记录 学c++都快5个月了,连一篇完整的学习记录都没写过,今天突发奇想(其实本来就应该写),就写了这么一篇学习记录(呵呵). 最近几天,一会不是写解题报告,就是做poj,有时玩会自己编(参考了别人代码的)的2048,页面做的还不错,还做coj.都快忙不过来了.最近又翻出一本叫<数据结构>的书,是清华大学的邓俊辉老师写的,很详细,还有示意图,很不错的书.准备“啃”个三四遍,反正一周“啃”完一次,课间也在那儿拼命地看,自

2016/02/20 codes

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>2016/02/20</title></head><body><div id="mainDiv"> <div id = "content"> <div id = &qu

2016年大学生研究性学习和创新性实验计划项目 我的项目 :二维码数据反馈系统 第四周作业

参加软件班后介于一直没有实训的机会,感觉自己应该主动找点项目,提升自己的技术水平,这次在老师和同学的帮助下参加了2016年大学生研究性学习和创新性实验计划项目: 下面是我参与的项目的一些简介: 项目名:二维码数据反馈系统    简述:二维码具有面积小,信息容量大,安全性高,读取率高,纠错能力强等优点,不仅能够存储足够的物品信息,还具有抗干扰能力强.运用环境适应性好.使用成本低廉等优点, 现今成为各种产品  防伪的首要选择.        项目的创新点和特色 :传统的生产厂商通过条形码来记录商品信

2016/7/20 1:18:29 PyQT5 炫酷的左侧导航效果

2016/7/20 1:18:29  完整code from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout, QTreeWidget, QTreeWidgetItem, QGroupBox) from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtCore import QSize class Bar_Navigation(QWidget): def __init__(self

2016.02.20 学习笔记 数据在Activity之间的传递的情况

情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用Intent类putExtra()方法实现. 具体在Onclick方法中的样例代码如下: Intent i1=new Intent(this,SecondActivity.class); String Message=Edit1.getText().toString(); i1.putExtra("M

学习进度(2016.3.20)

  第三周 所花时间(包括上课) 15小时 代码量(行) 400行 博客量(篇) 2篇 了解到的知识点 计算四则表达式的值,数据类型的转换

2016.2.20 css3 animation 的学习

使用css3 animation动画 'use strict'; var mousex, mousey; function tuo(el) { var move = function () { el.style.left = event.x - mousex + 'px'; el.style.top = event.y - mousey + 'px'; }; el.addEventListener('mousedown', function () { mousex = event.x - el.

分布式技术一周技术动态 2016.03.20

分布式系统实践 1. 基于Mesos和Docker的分布式计算平台 https://mp.weixin.qq.com/s?__biz=MzAxMDgzOTA2Mw==&mid=402769128&idx=1&sn=cea3ad1357bd9312acf1768c0a493bfd&scene=1&srcid=0318BTuxT0fsFYwPjpeyuDOa&key=710a5d99946419d90fbc1e7600cce055b6e997d6afafc74c