更多内容关注公众号【白羊哈哈】
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多平台发布