GCD Inside: 数据结构(一)

更多内容关注公众号【白羊哈哈】

iOS GCD 源码由于需要兼容 CC++Objective-C等语言,内部的数据结构很多都是采用宏扩展构造出来。

比如dispatch_queue_t就是由宏DISPATCH_DECL_FACTORY_CLASS_SWIFT(dispatch_queue, DispatchQueue)扩展。

因此,在 GCD 源码里面搜索相关的类名、结构体名,通常很难搜到,对于源码阅读造成一定的困难。所以,本文列举了 GCD 主要数据结构的宏扩展结果。

1 Objective-C 类

1.1 OS_object

OS_object由下面宏OS_OBJECT_DEC_BASE扩展而来:

c 复制代码
// 1. os/object.h
OS_OBJECT_DECL_BASE(object, NSObject);
 
// 2. os/object.h
#define OS_OBJECT_DECL_BASE(name, ...) \
		@interface OS_OBJECT_CLASS(name) : __VA_ARGS__ \
		- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); \
		@end

扩展之后的结果为:

ObjectiveC 复制代码
@interface OS_object : NSObject
 
- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
 
@end

从扩展结果可以看到,类OS_object继承自NSObject

OS_object的实现定义在src/object.m文件中,同样也是由宏定义:

ObjectiveC 复制代码
@implementation OS_OBJECT_CLASS(object)
DISPATCH_UNAVAILABLE_INIT()
 
-(id)retain {
	return _os_object_retain(self);
}
 
-(oneway void)release {
	return _os_object_release_without_xref_dispose(self);
}
 
-(NSUInteger)retainCount {
	return _os_object_retain_count(self);
}
 
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
 
-(BOOL)retainWeakReference {
	return _os_object_retain_weak(self);
}
 
-(BOOL)allowsWeakReference {
	return _os_object_allows_weak_reference(self);
}
 
#pragma clang diagnostic pop
 
- (void)_xref_dispose {
	return _os_object_release_internal(self);
}
 
@end
c 复制代码
// os/object_private.h
#define OS_OBJECT_CLASS(name) OS_##name

OS_OBJECT_CLASS的作用就是给宏参数加一个OS_前缀,因此OS_OBJECT_CLASS(object)扩展之后就是OS_object

上面代码第1行扩展之后就是@implementaion OS_object,正好定义了类OS_object的实现。

从扩展结果可以看到,OS_object重写了NSObjectretainretainCountrelease方法,并且还定义了一些自定义方法。

GCD 源码为OS_object定义了一个指针类型:

c 复制代码
// 1. os/object_private.h
typedef OS_OBJECT_CLASS(object) *_os_object_t;

扩展之后的结果为:

c 复制代码
typedef OS_object *_os_object_t;

1.2 OS_dispatch_object

OS_dispatch_object由宏OS_OBJECT_DECL_CLASS扩展而来:

c 复制代码
// 1. dispatch/object.h
OS_OBJECT_DECL_CLASS(dispatch_object);
 
// 2. os/object.h
#define OS_OBJECT_DECL_CLASS(name) \
		OS_OBJECT_DECL_SUBCLASS_SWIFT(name, object)
		
// 3. os/object.h
#define OS_OBJECT_DECL_SUBCLASS_SWIFT(name, super) \
		OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE \
		OS_OBJECT_DECL_IMPL_CLASS(name, OS_OBJECT_CLASS(super))
		
// 4. os/object.h
#define OS_OBJECT_DECL_IMPL_CLASS(name, ...) \
		OS_OBJECT_DECL_BASE(name, ## __VA_ARGS__) \
		typedef OS_OBJECT_CLASS(name) \
				* OS_OBJC_INDEPENDENT_CLASS name##_t

扩展之后的结果为:

ObjectiveC 复制代码
@interface OS_dispatch_object : OS_object
 
- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
 
@end
 
typedef OS_dispatch_object *dispatch_object_t

从扩展结果可以看到OS_dispatch_object继承自OS_objectdispatch_object_t的类型是OS_dispatch_object *

上面注释3处的宏OS_OBJECT_OBJC_RUNTIME_VISIBLE和注释4处的宏OS_OBJC_INDEPENDENT_CLASS都是Clang编译器的属性,对数据结构本身没有影响,因此没有写出来。

比如宏OS_OBJECT_OBJC_RUNTIME_VISIBLE扩展之后就是:

c 复制代码
__attribute__((objc_runtime_visible))

后续如果遇到同样这种编译器属性的宏,不会再单独提示。

OS_dispatch_object的实现位于src/object.m中:

ObjectiveC 复制代码
@implementation DISPATCH_CLASS(object)
DISPATCH_UNAVAILABLE_INIT()
 
- (NSString *)debugDescription {
	Class nsstring = objc_lookUpClass("NSString");
	if (!nsstring) return nil;
	char buf[2048];
	struct dispatch_object_s *obj = (struct dispatch_object_s *)self;
	if (dx_vtable(obj)->do_debug) {
		dx_debug(obj, buf, sizeof(buf));
	} else {
		strlcpy(buf, object_getClassName(self), sizeof(buf));
	}
	NSString *format = [nsstring stringWithUTF8String:"<%s: %s>"];
	if (!format) return nil;
	return [nsstring stringWithFormat:format, object_getClassName(self), buf];
}
 
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
- (void)dealloc {
	return _dispatch_dispose(self);
}
#pragma clang diagnostic pop
 
@end
c 复制代码
// src/object_internal.h
#define DISPATCH_CLASS(name) OS_dispatch_##name

DISPATCH_CLASS的作用是在宏参数前面加上前缀OS_dispatch_,因此DISPATCH_CLASS(object)扩展之后就是OS_dispatch_object

上面代码第1行扩展之后就是@implementation OS_dispatch_object,正好定义了OS_dispatch_object的实现。

从扩展结果可以看到,OS_dispatch_object重写了NSObjectdebugDescriptiondealloc方法。

1.3 OS_dispatch_queue

OS_dispatch_queue由宏DISPATCH_DECL_FACTORY_CLASS_SWIFT扩展而来:

c 复制代码
// 1. dispatch/queue.h
DISPATCH_DECL_FACTORY_CLASS_SWIFT(dispatch_queue, DispatchQueue);
 
// 2. dispatch/object.h
#define DISPATCH_DECL_FACTORY_CLASS_SWIFT(name, swift_name) \
		OS_OBJECT_SWIFT_HAS_MISSING_DESIGNATED_INIT DISPATCH_DECL_SWIFT(name, swift_name)
		
// 3. dispatch/object.h
#define DISPATCH_DECL_SWIFT(name, swift_name) DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL(name)
 
// 4. dispatch/object.h
#define DISPATCH_DECL(name) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, dispatch_object)
 
// 5. os/object.h
#define OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, super) \
		OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE OS_OBJECT_SWIFT_SENDABLE \
		OS_OBJECT_DECL_IMPL_CLASS(name, OS_OBJECT_CLASS(super))

扩展之后的结果为:

ObjectiveC 复制代码
@interface OS_dispatch_queue : OS_dispatch_object
 
- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
 
@end
 
typedef OS_dispatch_queue *dispatch_queue_t;

从扩展结果可以看到,OS_dispatch_queue继承自OS_dispatch_objectdispatch_queue_t类型就是OS_dispatch_queue *

OS_dispatch_queue的实现部分位于src/object.m中:

ObjectiveC 复制代码
@implementation DISPATCH_CLASS(queue)
OS_OBJECT_NONLAZY_CLASS_LOAD
DISPATCH_UNAVAILABLE_INIT()
DISPATCH_OBJECT_USES_XREF_DISPOSE()
 
- (NSString *)description {
	Class nsstring = objc_lookUpClass("NSString");
	if (!nsstring) return nil;
	NSString *format = [nsstring stringWithUTF8String:"<%s: %s>"];
	if (!format) return nil;
	return [nsstring stringWithFormat:format, object_getClassName(self),
			dispatch_queue_get_label(self), self];
}
 
- (void)_xref_dispose {
	_dispatch_queue_xref_dispose((struct dispatch_queue_s *)self);
	[super _xref_dispose];
}
 
@end

DISPATCH_CLASSOS_dispatch_object中已经提及,作用是在宏参数前面加上前缀OS_dispatch_。因此DISPATCH_CLASS(queue)扩展之后就是OS_dispatch_queue

文章后续如果出现了前文出现过的宏,不会再给出相关的宏定义,而是直接给出扩展结果。

上面代码第1行扩展之后就是@implementation OS_dispatch_queue,正好定义了OS_dispatch_queue的实现。

从扩展结果可以看到,OS_dispatch_queue重写了NSObjectdescription方法。

1.4 OS_dispatch_queue_serial

OS_dispatch_queue_serial由宏DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT扩展而来:

c 复制代码
// 1. dispatch/queue.h
DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(dispatch_queue_serial, DispatchSerialQueue);
 
// 2. dispatch/object.h
#define DISPATCH_DECL_SERIAL_EXECUTOR_SWIFT(name, swift_name) \
		DISPATCH_DECL_SUBCLASS_SWIFT(name, dispatch_queue, swift_name)
		
// 3. dispatch/object.h
#define DISPATCH_DECL_SUBCLASS_SWIFT(name, base, swift_name) \
		DISPATCH_SWIFT_NAME(swift_name) DISPATCH_DECL_SUBCLASS(name, base)
 
// 4. dispatch/object.h
#define DISPATCH_DECL_SUBCLASS(name, base) OS_OBJECT_DECL_SENDABLE_SUBCLASS_SWIFT(name, base)

扩展之后的结果为:

ObjectiveC 复制代码
@interface OS_dispatch_queue_serial : OS_dispatch_queue
 
- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
 
@end
 
typedef OS_dispatch_queue_serial *dispatch_queue_serial_t;

从扩展结果可以看到,OS_dispatch_queue_serial继承自OS_dispatch_queuedispatch_queue_serial_t类型就是OS_dispatch_queue_serial

OS_dispatch_queue_serial的实现位于src/object.m中:

ObjectiveC 复制代码
// 1. src/object.m
DISPATCH_CLASS_IMPL(queue_serial)
 
// 2. src/object.m
#define DISPATCH_CLASS_IMPL(name) \
		EMPTY_OS_OBJECT_CLASS_IMPL(DISPATCH_CLASS(name))
 
// 3. src/object.m
#define EMPTY_OS_OBJECT_CLASS_IMPL(name) \
		OS_OBJECT_NONLAZY_CLASS \
		@implementation name \
		OS_OBJECT_NONLAZY_CLASS_LOAD \
		DISPATCH_UNAVAILABLE_INIT() \
		@end
 
// 4. src/object_internal.h
#define DISPATCH_UNAVAILABLE_INIT() \
	- (instancetype)init { \
		DISPATCH_CLIENT_CRASH(0, "-init called directly"); \
		return [super init]; \
	}

扩展的结果为:

ObjectiveC 复制代码
@implementation OS_dispatch_queue_serial
 
- (instancetype)init {
	return [super init];
}
 
@end

1.5 OS_dispatch_queue_concurrent

OS_dispatch_queque_concurrent由宏DISPATCH_DECL_SUBCLASS_SWIFT扩展而来:

c 复制代码
// 1. dispatch/queue.h
DISPATCH_DECL_SUBCLASS_SWIFT(dispatch_queue_concurrent, dispatch_queue, DispatchConcurrentQueue);

扩展结果为:

ObjectiveC 复制代码
@interface OS_dispatch_queue_concurrent : OS_dispatch_queue
 
- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
 
@end
 
typedef OS_dispatch_queue_concurrent *dispatch_queue_concurrent_t;

从扩展结果可以看到,OS_dispatch_queue_concurrent继承自OS_dispatch_queuedispatch_queue_concurrent类型是OS_dispatch_queue_concurrent *

OS_dispatch_queue_concurrent的实现位于src/object.m中:

c 复制代码
DISPATCH_CLASS_IMPL(queue_concurrent)

扩展之后的结果为:

ObjectiveC 复制代码
@implementation OS_dispatch_queue_concurrent
 
- (instancetype)init {
	return [super init];
}
 
@end

1.6 OS_dispatch_queue_main

OS_dispatch_queue_main由宏DISPATCH_DECL_SUBCLASS扩展而来:

c 复制代码
// 1. dispatch/queue.h
DISPATCH_DECL_SUBCLASS(dispatch_queue_main, dispatch_queue_serial);

扩展之后的结果为:

ObjectiveC 复制代码
@interface OS_dispatch_queue_main : OS_dispatch_queue_serial
 
- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
 
@end
 
typedef OS_dispatch_queue_main *dispatch_queue_main_t;

从扩展结果可以看到,OS_dispatch_queue_main继承自OS_dispatch_queue_serialdispatch_queue_main_t类型就是OS_dispatch_queue_main *

OS_dispatch_queue_main的实现部分位于src/object.m中:

c 复制代码
// 1. src/object.m
DISPATCH_CLASS_IMPL(queue_main)

扩展之后的结果为:

ObjectiveC 复制代码
@implementation OS_dispatch_queue_main
 
- (instancetype)init {
	return [super init];
}
 
@end

1.7 OS_dispatch_queue_global

OS_disaptch_queue_global由宏DISPATCH_DECL_SUBCLASS扩展而来:

c 复制代码
// 1. dispatch/queue.h
DISPATCH_DECL_SUBCLASS(dispatch_queue_global, dispatch_queue);

扩展之后的结果为:

ObjectiveC 复制代码
@interface OS_dispatch_queue_global : OS_dispatch_queue
 
- (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift");
 
@end
 
typedef OS_dispatch_queue_global *dispatch_queue_global_t;

从扩展结果可以看到,OS_dispatch_queue_global继承自OS_dispatch_queuedispatch_queue_global_t类型就是OS_dispatch_queue_global

OS_dispatch_queue_global的实现位于src/object.m中:

c 复制代码
// 1. src/object.m
DISPATCH_CLASS_IMPL(queue_global)

扩展之后的结果为:

ObjectiveC 复制代码
@implementation OS_dispatch_queue_global
 
- (instancetype)init {
	return [super init];
}
 
@end

2 Objective-C 协议

上面每一个 OC 类,都拥有一个同名的 OC 协议。

2.1 <OS_object>

<OS_object>由宏OS_OBJECT_DECL_PROTOCOL定义:

c 复制代码
// 1. os/object_private.h
OS_OBJECT_DECL_PROTOCOL(object, <NSObject>);
 
// 2. os/object.h
#define OS_OBJECT_DECL_PROTOCOL(name, ...) \
		@protocol OS_OBJECT_CLASS(name) __VA_ARGS__ \
		@end

扩展之后的结果为:

ObjectiveC 复制代码
@protocol OS_object <NSObject>
 
@end

从扩展结果可以看到,<OS_object>继承自<NSObject>

2.2 <OS_dispatch_object>

<OS_dispatch_object>由宏_OS_OBJECT_DECL_PROTOCOL定义:

c 复制代码
// 1. src/object_internal.h
_OS_OBJECT_DECL_PROTOCOL(dispatch_object, object);
 
// 2. os/object_private.h
#define _OS_OBJECT_DECL_PROTOCOL(name, super) \
		OS_OBJECT_DECL_PROTOCOL(name, <OS_OBJECT_CLASS(super)>)

扩展之后的结果为:

ObjectiveC 复制代码
@protocol OS_dispatch_object <OS_object>
 
@end

从扩展结果看,<OS_dispatch_object>继承自<OS_object>

2.3 <OS_dispatch_queue>

<OS_dispatch_queue>由宏DISPATCH_CLASS_DECL定义:

c 复制代码
// 1. src/queue_internal.h
DISPATCH_CLASS_DECL(queue, QUEUE);
 
// 2. src/object_internal.h
#define DISPATCH_CLASS_DECL(name, cluster) \
		_OS_OBJECT_DECL_PROTOCOL(dispatch_##name, dispatch_object) \
		_OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(dispatch_##name, dispatch_##name) \
		DISPATCH_CLASS_DECL_BARE(name, cluster)

DISPATCH_CLASS_DECL3个宏构成,其中宏DISPATCH_CLASS_DECL_BARE《GCD Inside: 数据结构(二》解释。

_OS_OBJECT_DECL_PROTOCOL扩展之后的结果为:

ObjectiveC 复制代码
@protocol OS_dispatch_queue <OS_dispatch_object>
 
@end

从扩展结果看,<OS_dispatch_queue>继承自<OS_dispatch_object>

_OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL的定义如下:

c 复制代码
// 1. os/object_private.h
#define _OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, super) \
		OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, super)
		
// 2. os/object.h
#define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, proto) \
		OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL( \
				OS_OBJECT_CLASS(name), OS_OBJECT_CLASS(proto))
				
// 3. os/object.h
#define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL(name, proto) \
		@interface name () <proto> \
		@end

扩展结果为:

ObjectiveC 复制代码
@interface OS_dispatch_queue () <OS_dispatch_queue>
 
@end

从扩展结果看,类OS_dispatch_queue实现了同名的协议<OS_dispatch_queue>

2.4 <OS_dispatch_queue_serial>

<OS_dispatch_queue_serial>由宏DISPATCH_SUBCLASS_DECL定义:

c 复制代码
// 1. src/queue_internal.h
DISPATCH_SUBCLASS_DECL(queue_serial, queue_serial_executor, lane);
 
// 2. src/object_internal.h
#define DISPATCH_SUBCLASS_DECL(name, super, ctype) \
		_OS_OBJECT_DECL_PROTOCOL(dispatch_##name, dispatch_##super); \
		_OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(dispatch_##name, dispatch_##name) \
		OS_OBJECT_SUBCLASS_DECL(dispatch_##name, dispatch_##ctype)

DISPATCH_SUBCLASS_DECL3个宏构成,其中宏OS_OBJECT_SUBCLASS_DECL《GCD Inside: 数据结构(二)》中解释。

_OS_OBJECT_DECL_PROTOCOL_OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL扩展的结果为:

ObjectiveC 复制代码
@protocol OS_dispatch_queue_serial <OS_dispatch_queue_serial_executor>
 
@end
 
@interface OS_dispatch_queue_serial () <OS_dispatch_queue_serial>
 
@end

从扩展结果看,<OS_dispatch_queue_serial>继承自<OS_dispatch_queue_serial_executor>,同时类OS_dispatch_queue_serial实现了同名的协议<OS_dispatch_queue_serial>

协议<OS_dispatch_queue_serial_executor>是 GCD 内部的一个协议,同样也由宏DISPATCH_SUBCLASS_DECL定义:

协议<OS_dispatch_queue_serial_executor>是 GCD 内部的一个协议,同样也有宏DISPATCH_SUBCLASS_DECL定义:

c 复制代码
// 1. src/queue_internal.h
DISPATCH_SUBCLASS_DECL(queue_serial_executor, queue, lane);

因此,协议<OS_dispatch_queue_serial_executor>继承自<OS_dispatch_queue>

2.5 <OS_dispatch_queue_concurrent>

<OS_dispatch_queue_concurrent>由宏DISPATCH_SUBCLASS_DECL定义:

c 复制代码
// 1. src/queue_internal.h
DISPATCH_SUBCLASS_DECL(queue_concurrent, queue, lane);

扩展结果为:

ObjectiveC 复制代码
@protocol OS_dispatch_queue_concurrent <OS_dispatch_queue>
 
@end
 
@interface OS_dispatch_queue_concurrent () <OS_dispatch_queue_concurrent>
 
@end

从扩展结果可以看到,<OS_dispatch_queue_concurrent>继承自<OS_dispatch_queue>,同时类OS_dispatch_queue_concurrent实现了同名协议<OS_dispatch_queue_concurrent>

2.6 <OS_dispatch_queue_main>

OS_dispatch_queue_main由宏DISPATCH_SUBCLASS_DECL定义:

c 复制代码
// 1. src/queue_internal.h
DISPATCH_SUBCLASS_DECL(queue_main, queue_serial, lane);

扩展结果为:

ObjectiveC 复制代码
@protocol OS_dispatch_queue_main <OS_dispatch_queue_serial>
 
@end
 
@interface OS_dispatch_queue_main () <OS_dispatch_queue_main>
 
@end

从扩展结果可以看到,<OS_dispatch_queue_main>继承自<OS_dispatch_queue_serial>,同时类OS_dispatch_queue_main实现了同名协议<OS_dispatch_queue_main>

2.7 <OS_dispatch_queue_global>

<OS_dispatch_queue_global>由宏DISPATCH_SUBCLASS_DECL定义:

c 复制代码
// 1. src/queue_internal.h
DISPATCH_SUBCLASS_DECL(queue_global, queue, lane);

扩展结果为:

ObjectiveC 复制代码
@protocol OS_disaptch_queue_global <OS_dispatch_queue>
 
@end
 
@interface OS_dispatch_queue_global () <OS_dispatch_queue_global>
 
@end

从扩展结果可以看到,<OS_dispatch_queue_global>继承自<OS_dispatch_queue>,同时类OS_dispatch_queue_global实现了同名的协议<OS_dispatch_queue_global>

3 总结

完整的 GCD 类与协议的关系如下图所示:

本文由mdnice多平台发布

相关推荐
后端小肥肠15 小时前
从被裁程序媛到月入过万自由人,我只用了90天!秘密藏在这几个操作里
程序员
GanymedeNil17 小时前
卧槽,我好像忘了怎么写代码了 |当AI能搞定一切,你的价值就剩“Debug”了
程序员
DeepSeek忠实粉丝17 小时前
Deepseek篇--阿里QwQ-325b性能比肩Deepseek满血版
人工智能·程序员·llm
硬核隔壁老王18 小时前
AI Agent从概念到实战全面解析(三):AI Agent 运作机制与大模型协同
人工智能·程序员·llm
快起来别睡了18 小时前
CSS定位的奥秘:从文档流到position,一文讲透前端布局核心!
前端·css·程序员
LLM大模型18 小时前
LangChain篇-自定义RAG加载器
人工智能·程序员·llm
LLM大模型18 小时前
LangChain篇-自定义会话管理和Retriever
人工智能·程序员·llm
陈随易21 小时前
VSCode v1.101发布,MCP极大增强关联万物,基于VSCode的操作系统雏形已初见端倪
前端·后端·程序员
redreamSo21 小时前
AI Daily | AI日报:Alexandr Wang加盟Meta,AI竞赛风云突变; Meta推V-JEPA 2,小扎抢人才; SwitchBot:国产AI破日本市场
程序员·aigc·资讯
一块plus1 天前
Polkadot 的 Web3 哲学:从乔布斯到 Gavin Wood 的数字自由传承
人工智能·程序员·架构