usr/include/dispatch - object.h

1###

建议先阅读os/object.h头文件

在os/object.h中:

#ifndef OS_OBJECT_HAVE_OBJC_SUPPORT
#if defined(__OBJC__) && defined(__OBJC2__) && !defined(__OBJC_GC__) && ( \
		__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_8 || \
		__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0)
#define OS_OBJECT_HAVE_OBJC_SUPPORT 1
#else
#define OS_OBJECT_HAVE_OBJC_SUPPORT 0
#endif
#endif

定义了宏OS_OBJECT_HAVE_OBJC_SUPPORT,如果1即ARC,所以dispatch_object_t可以自动retain和release实现内存管理,满足4点:

  • _OBJC_
  • _OBJC2_
  • ! _OBJC_GC_
  • __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_8 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0

注释:objc-GC
名称 类别 描述
GCC SYS-DEVEL GNU编译器集


2##

#import <object.h>中,我们首先看到关于OS_OBJECT_USE_OBJC、__cplusplus和其他情况下(Plain C)的兼容适配的宏定义,dispatch_object_t是所有dispatch对象的抽象基类,它具体类型根据language-specific,例如上述三种情况。

#if OS_OBJECT_USE_OBJC
 ...
_dispatch_object_validate(dispatch_object_t object) {
	void *isa = *(void* volatile*)(OS_OBJECT_BRIDGE void*)object;
	(void)isa;
}

#elif defined(__cplusplus) && !defined(__DISPATCH_BUILDING_DISPATCH__)
...} *dispatch_object_t;

#else /* Plain C */
typedef union{
...
}dispatch_object_t


3.dispatch_block_t的block####

typedef void (^dispatch_block_t)(void);

4.dispatch_retain###

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
void
dispatch_retain(dispatch_object_t object);
#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE
#undef dispatch_retain
#define dispatch_retain(object) ({ dispatch_object_t _o = (object); \
		_dispatch_object_validate(_o); (void)[_o retain]; })
#endif

5.dispatch_release###

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
void
dispatch_release(dispatch_object_t object);
#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE
#undef dispatch_release
#define dispatch_release(object) ({ dispatch_object_t _o = (object); \
		_dispatch_object_validate(_o); [_o release]; })
#endif

6.dispatch_get_context 取得object上下文###

void *
dispatch_get_context(dispatch_object_t object);

7.dispatch_set_context 设置object上下文###

void
dispatch_set_context(dispatch_object_t object, void *context);

8.dispatch_set_finalizer_f 设置object的终止函数###

void
dispatch_set_finalizer_f(dispatch_object_t object,
		dispatch_function_t finalizer);

9.dispatch_resume 恢复object在block的调用###

void
dispatch_resume(dispatch_object_t object);

10.dispatch_suspend 推迟object在block的调用###

void
dispatch_resume(dispatch_object_t object);

11.dispatch_wait 同步等待object对象操作###

long
dispatch_wait(void *object, dispatch_time_t timeout);
#if __has_extension(c_generic_selections)
#define dispatch_wait(object, timeout) \
		_Generic((object), \
			dispatch_block_t:dispatch_block_wait, \
			dispatch_group_t:dispatch_group_wait, \
			dispatch_semaphore_t:dispatch_semaphore_wait \
		)((object),(timeout))
#endif

12..dispatch_notify###

在一个队列中当一个指定的object执行完之后就调度一个block通知回调。

void
dispatch_notify(void *object, dispatch_object_t queue,
		dispatch_block_t notification_block);
#if __has_extension(c_generic_selections)
#define dispatch_notify(object, queue, notification_block) \
		_Generic((object), \
			dispatch_block_t:dispatch_block_notify, \
			dispatch_group_t:dispatch_group_notify \
		)((object),(queue), (notification_block))
#endif

13.dispatch_cancel###

void
dispatch_cancel(void *object);
#if __has_extension(c_generic_selections)
#define dispatch_cancel(object) \
		_Generic((object), \
			dispatch_block_t:dispatch_block_cancel, \
			dispatch_source_t:dispatch_source_cancel \
		)((object))
#endif

14.dispatch_testcancel####

long
dispatch_testcancel(void *object);
#if __has_extension(c_generic_selections)
#define dispatch_testcancel(object) \
		_Generic((object), \
			dispatch_block_t:dispatch_block_testcancel, \
			dispatch_source_t:dispatch_source_testcancel \
		)((object))
#endif

15.debug函数###

😄

总结###

dispatch_object_t作为dispatch系列的基类,定义了基类该有的API,很好很强大

posted @ 2016-04-26 12:04  lvable  阅读(481)  评论(0)    收藏  举报