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多平台发布

相关推荐
程序员cxuan26 分钟前
DeepSeek Harness 必装的插件公布了!
人工智能·后端·程序员
卡卡罗特学AI1 小时前
Codex 百万上下文终于能开了,只要改这 3 行配置
程序员
SamDeepThinking2 小时前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
无责任此方_修行中2 小时前
AI 成本复盘!5 个月后的真实使用情况(附账单)
后端·程序员·ai编程
PC2005_cloud2 小时前
DSH 沙箱机制拆解:受限令牌为何会掐断 HTTPS 请求
前端·程序员
Hilaku3 小时前
高级前端如何优雅地拒绝不合理的产品需求?
前端·javascript·程序员
烬羽3 小时前
nginx 里写 localhost 反而 502?一条请求带你彻底搞懂 Docker 端口映射与反向代理
nginx·docker·程序员
程序员cxuan4 小时前
一招教你在 Codex 中开启 1M 上下文
人工智能·后端·程序员
程序员鱼皮16 小时前
小红书爆了!中美程序员疯狂对账
计算机·程序员·互联网·编程经验
不一样的少年_1 天前
修了 Bug、做了重构,为什么老板还是觉得你没产出?
前端·后端·程序员