| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- .\" Copyright (c) 2008-2012 Apple Inc. All rights reserved.
- .Dd March 1, 2012
- .Dt dispatch_object 3
- .Os Darwin
- .Sh NAME
- .Nm dispatch_object
- .Nd General manipulation of dispatch objects
- .Sh SYNOPSIS
- .Fd #include <dispatch/dispatch.h>
- .Ft void
- .Fo dispatch_retain
- .Fa "dispatch_object_t object"
- .Fc
- .Ft void
- .Fo dispatch_release
- .Fa "dispatch_object_t object"
- .Fc
- .Ft void
- .Fo dispatch_suspend
- .Fa "dispatch_object_t object"
- .Fc
- .Ft void
- .Fo dispatch_resume
- .Fa "dispatch_object_t object"
- .Fc
- .Ft void
- .Fo dispatch_activate
- .Fa "dispatch_object_t object"
- .Fc
- .Ft "void *"
- .Fo dispatch_get_context
- .Fa "dispatch_object_t object"
- .Fc
- .Ft void
- .Fo dispatch_set_context
- .Fa "dispatch_object_t object"
- .Fa "void *context"
- .Fc
- .Ft void
- .Fo dispatch_set_finalizer_f
- .Fa "dispatch_object_t object"
- .Fa "dispatch_function_t finalizer"
- .Fc
- .Sh DESCRIPTION
- Dispatch objects share functions for coordinating memory management, suspension,
- cancellation and context pointers.
- .Sh MEMORY MANAGEMENT
- Objects returned by creation functions in the dispatch framework may be
- uniformly retained and released with the functions
- .Fn dispatch_retain
- and
- .Fn dispatch_release
- respectively.
- .Pp
- The dispatch framework does not guarantee that any given client has the last or
- only reference to a given object. Objects may be retained internally by the
- system.
- .Ss INTEGRATION WITH OBJECTIVE-C
- .Bd -filled -offset indent
- When building with an Objective-C or Objective-C++ compiler, dispatch objects
- are declared as Objective-C types. This results in the following differences
- compared to building as plain C/C++:
- .Bl -dash
- .It
- if Objective-C Automated Reference Counting is enabled, dispatch objects are
- memory managed by the Objective-C runtime and explicit calls to the
- .Fn dispatch_retain
- and
- .Fn dispatch_release
- functions will produce build errors.
- .Pp
- .Em Note :
- when ARC is enabled, care needs to be taken with dispatch API returning an
- interior pointer that is only valid as long as an associated object has not
- been released. If that object is held in a variable with automatic storage, it
- may need to be annotated with the
- .Li objc_precise_lifetime
- attribute, or stored in a
- .Li __strong
- instance variable instead, to ensure that the object is not prematurely
- released. The functions returning interior pointers are
- .Xr dispatch_data_create_map 3
- and
- .Xr dispatch_data_apply 3 .
- .It
- the Blocks runtime automatically retains and releases dispatch objects captured
- by blocks upon
- .Fn Block_copy
- and
- .Fn Block_release ,
- e.g.\& as performed during asynchronous execution of a block via
- .Xr dispatch_async 3 .
- .Pp
- .Em Note :
- retain cycles may be encountered if dispatch source objects are captured by
- their handler blocks; these cycles can be broken by declaring the captured
- object
- .Li __weak
- or by calling
- .Xr dispatch_source_cancel 3
- to cause its handler blocks to be released explicitly.
- .It
- dispatch objects can be added directly to Cocoa collections, and their
- lifetime is tracked by the Objective-C static analyzer.
- .El
- .Pp
- Integration of dispatch objects with Objective-C requires targeting Mac\ OS\ X
- 10.8 or later, and is disabled when building for the legacy Objective-C runtime.
- It can also be disabled manually by using compiler options to define the
- .Dv OS_OBJECT_USE_OBJC
- preprocessor macro to
- .Li 0 .
- .Ed
- .Pp
- .Em Important :
- When building with a plain C/C++ compiler or when integration with Objective-C
- is disabled, dispatch objects are
- .Em not
- automatically retained and released when captured by a block. Therefore, when a
- dispatch object is captured by a block that will be executed asynchronously,
- the object must be manually retained and released:
- .Pp
- .Bd -literal -offset indent
- dispatch_retain(object);
- dispatch_async(queue, ^{
- do_something_with_object(object);
- dispatch_release(object);
- });
- .Ed
- .Sh ACTIVATION
- Dispatch objects such as queues and sources may be created in an inactive
- state. Objects in this state must be activated before any blocks
- associated with them will be invoked. Calling
- .Fn dispatch_activate
- on an active object has no effect.
- .Pp
- Changing attributes such as the target queue or a source handler is no longer permitted
- once the object has been activated (see
- .Xr dispatch_set_target_queue 3 ,
- .Xr dispatch_source_set_event_handler 3 ).
- .Sh SUSPENSION
- The invocation of blocks on dispatch queues or dispatch sources may be suspended
- or resumed with the functions
- .Fn dispatch_suspend
- and
- .Fn dispatch_resume
- respectively. Other dispatch objects do not support suspension.
- .Pp
- The dispatch framework always checks the suspension status before executing a
- block, but such changes never affect a block during execution (non-preemptive).
- Therefore the suspension of an object is asynchronous, unless it is performed
- from the context of the target queue for the given object.
- The result of suspending or resuming an object that is not a dispatch queue or
- a dispatch source is undefined.
- .Pp
- .Em Important :
- suspension applies to all aspects of the dispatch object life cycle, including
- the finalizer function and cancellation handler. Suspending an object causes it
- to be retained and resuming an object causes it to be released. Therefore it is
- important to balance calls to
- .Fn dispatch_suspend
- and
- .Fn dispatch_resume
- such that the dispatch object is fully resumed when the last reference is
- released. The result of releasing all references to a dispatch object while in
- an inactive or suspended state is undefined.
- .Sh CONTEXT POINTERS
- Dispatch objects support supplemental context pointers. The value of the
- context pointer may be retrieved and updated with
- .Fn dispatch_get_context
- and
- .Fn dispatch_set_context
- respectively.
- The
- .Fn dispatch_set_finalizer_f
- specifies an optional per-object finalizer function that is invoked
- asynchronously if the context pointer is not NULL when the last
- reference to the object is released.
- This gives the
- application an opportunity to free the context data associated with the object.
- The finalizer will be run on the object's target queue.
- .Sh SEE ALSO
- .Xr dispatch 3 ,
- .Xr dispatch_async 3 ,
- .Xr dispatch_group_create 3 ,
- .Xr dispatch_queue_create 3 ,
- .Xr dispatch_semaphore_create 3 ,
- .Xr dispatch_set_target_queue 3 ,
- .Xr dispatch_source_cancel 3 ,
- .Xr dispatch_source_create 3
|