更多内容关注公众号【白羊哈哈】
iOS GCD 源码由于需要兼容 C、C++、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重写了NSObject的retain、retainCount、release方法,并且还定义了一些自定义方法。
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_object,dispatch_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重写了NSObject的debugDescription、dealloc方法。
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_object,dispatch_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_CLASS在OS_dispatch_object中已经提及,作用是在宏参数前面加上前缀OS_dispatch_。因此DISPATCH_CLASS(queue)扩展之后就是OS_dispatch_queue。
文章后续如果出现了前文出现过的宏,不会再给出相关的宏定义,而是直接给出扩展结果。
上面代码第1行扩展之后就是@implementation OS_dispatch_queue,正好定义了OS_dispatch_queue的实现。
从扩展结果可以看到,OS_dispatch_queue重写了NSObject的description方法。
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_queue,dispatch_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_queue,dispatch_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_serial,dispatch_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_queue,dispatch_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_DECL由3个宏构成,其中宏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_DECL由3个宏构成,其中宏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多平台发布