iOS GCD 底层源码分析
内容提要
本文介绍了iOS中行列(dispatch queue)的底层源码剖析。行列的创立是通过GCD中的dispatch_queue_create方法实现的。文章详细解释了dispatch_queue_create方法的实现过程,包括参数规范化、拼接行列名称、内存分配、设置行列标识符和优先级处理等步骤。最后指出行列的创立是通过模板创建的,并提供了dispatch_queue_create底层剖析流程的图示。
延伸解读
从参数到类型:串行与并发的底层区分
文章指出,dispatch_queue_create 的第二个参数(attr)决定了队列类型。在底层,通过 _dispatch_queue_attr_to_info 解析出 dqai 结构,其中 dqai_concurrent 布尔值用于区分串行与并发。在 _dispatch_queue_init 中,该值进一步影响队列宽度参数:并发队列使用 DISPATCH_QUEUE_WIDTH_MAX,串行队列则固定为 1。因此,队列类型并非简单标记,而是通过底层参数控制其行为。
队列也是对象:alloc 与 isa 的绑定
文章强调,队列本质上是一个对象,其创建过程与普通对象类似,需要经过 alloc 和 init。在 _dispatch_object_alloc 中,通过 vtable 指定类类型,并在 _os_object_alloc_realized 中设置 isa 指向。vtable 由宏 DISPATCH_VTABLE 拼接而成,例如串行队列对应 OS_dispatch_queue_serial,并发队列对应 OS_dispatch_queue_concurrent。这验证了队列作为 Objective-C 对象的底层实现机
模板化创建:与普通类的差异
文章提到,队列的底层创建并非直接使用自定义类,而是通过模板完成。在 _dispatch_trace_queue_create 等函数中,最终会使用 dispatch_introspection_queue_s 结构体来构建队列。这种模板化方式意味着队列的创建过程更加统一和高效,同时也解释了为什么队列类型可以通过宏拼接动态确定,而不是硬编码的类继承关系。
Q&A
dispatch_queue_create方法的作用是什么?
dispatch_queue_create方法用于在iOS中创建行列,支持串行和并发类型。
行列的类型是如何决定的?
行列的类型通过dispatch_queue_create方法的参数决定,参数可以指定为串行或并发。
dispatch_queue_create的实现过程包括哪些步骤?
实现过程包括参数规范化、拼接行列名称、内存分配、设置行列标识符和优先级处理等步骤。
行列在底层是如何创建的?
行列在底层通过alloc和init方法创建,并使用模板进行处理。
dispatch_queue_create方法的参数规范化是指什么?
参数规范化是指对传入的行列属性进行标准化处理,以确保正确创建行列。
行列的优先级是如何处理的?
行列的优先级通过_dispatch_priority_make函数进行处理,结合行列属性中的优先级信息。