美文网首页
iOS多线程-RunLoop

iOS多线程-RunLoop

作者: rainbowboy | 来源:发表于2018-08-27 14:49 被阅读14次

1、概念

RunLoop与线程关联的,是一种事件处理环,用来安排和协调到来的事件,目的就是让其关联的线程在有事件到达时时刻保持运行状态,而当没有事件需要处理时进入睡眠状态从而节约资源,每一个线程都可以有一个RunLoop对象与之对应,并且是在第一次获取它是系统自动创建的,比如主线程关联的RunLoop,我们都知道程序的入口函数是main函数,下面是创建工程后Xcode自动生成的main.m文件的main函数代码:

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

该方法执行体被autoreleasepool包围,所以程序可以使用ARC来管理内存,后面会讲解RunLoopautoreleasepool的关系,main函数直接返回了UIApplicationMain函数,该函数内部就会第一次获取RunLoop对象,所以系统就会创建这样一个RunLoop对象,因此在没有满足特定条件的时候该主线程不会退出,应用就可以持续运行而不会退出。

在官方文档中使用下图描述RunLoop模型:

官方RunLoop图

从上图可以看出一个线程会关联一个RunLoop对象,RunLoop对象会一直循环,直到超时或收到退出指令。在无限循环的过程中会一直处理到来的事件,右侧将事件分为了两类,一类是Input sources这部分包括基于端口的source1事件,开发者提交的各种source0事件,调用performSelector:onThread:方法事件,还有一类Timer sources这个就是常用的定时器事件,这些事件在程序运行期间会不断产生之后会由RunLoop对象检测并负责处理相关事件。

2、RunLoop 源码解析

RunLoop有两个对象,NSRunLoopCFRunLoopRef,区别在于由Core Foundation框架提供的CFRunLoopRef是纯C语言编写的,提供的也是C语言接口,这些接口都是线程安全的,由Foundation框架提供的NSRunLoop是面向对象的,它是基于CFRunLoopRef的封装,提供的都是面向对象的接口,但这些接口不是线程安全的,Core Foudation框架是开源的,可以在这个地址下载:Core Foundation开源代码,本文接下来的内容主要是针对该开源代码进行讲解。

首先,看一下在代码中如何获取RunLoop对象,在Foundation框架中的NSRunLoop类提供了如下两个类属性:

//获取当前线程关联的RunLoop对象
@property (class, readonly, strong) NSRunLoop *currentRunLoop;
//获取主线程关联的RunLoop对象
@property (class, readonly, strong) NSRunLoop *mainRunLoop

对应的Core Foundation里提供下面两个函数来获取RunLoop对象

//获得当前线程关联的RunLoop对象
CFRunLoopGetCurrent(); 
// 获得主线程关联的RunLoop对象
CFRunLoopGetMain();

具体细节可以查阅这里:深入理解RunLoop

更新时间 2018-08-27

相关文章

  • GeekBand - iOS 多线程和RunLoop 总结

    iOS 开发高级进阶 第三周 多线程 Runloop iOS 多线程以及 RunLoop 学习总结 基础知识 什么...

  • RunLoop

    iOS刨根问底-深入理解RunLoop runloop 和线程有什么关系 iOS 多线程:RunLoop详细总结

  • iOS 多线程:『RunLoop』详尽总结

    本文用来介绍 iOS 多线程中,RunLoop 的相关知识。主要包括如下内容:RunLoop 简介RunLoop ...

  • iOS-多线程相关

    本篇涵盖多线程解析、应用等. 1.iOS多线程--彻底学会多线程之『RunLoop』2.iOS多线程--彻底学会多...

  • RunLoop初探,满足项目的基本应用

    iOS开发肯定离不开多线程编程,而多线程又跟RunLoop有着密切的关系,这篇文章就来解剖下RunLoop。 每个...

  • Runloop总结

    深入理解RunLoopMac&iOS之多线程CFRunLoop运用 RunLoop 的概念 runloop是一个对...

  • iOS RunLoop 详解

    转自 iOS RunLoop 详解 image.png Runloop 是和线程紧密相关的基础组件,是很多多线程有...

  • iOS POSIX多线程编程

    关于多线程的介绍、多线程的创建、使用场景和Runloop可以参考《iOS多线程编程指南》。已上传到GitHub仓库...

  • iOS面试-基础

    [toc] Runloop AutoReleasePool 多线程 响应者链 消息响应机制 消息转发机制 iOS内...

  • iOS底层原理--oc

    在长期iOS开发中,oc是iOS的基础也是重中之重,相比runtime,runloop,多线程等知识都要重要的多,...

网友评论

      本文标题:iOS多线程-RunLoop

      本文链接:https://www.haomeiwen.com/subject/rfcziftx.html