The following rules apply to variables used within a block:
-
Global variables are accessible, including static variables that exist within the enclosing lexical scope.
-
Parameters passed to the block are accessible (just like parameters to a function).
-
Stack (non-static) variables local to the enclosing lexical scope are captured as
const
variables.Their values are taken at the point of the block expression within the program. In nested blocks, the value is captured from the nearest enclosing scope.
-
Variables local to the enclosing lexical scope declared with the
__block
storage modifier are provided by reference and so are mutable.Any changes are reflected in the enclosing lexical scope, including any other blocks defined within the same enclosing lexical scope. These are discussed in more detail in “The __block Storage Type.”
-
Local variables declared within the lexical scope of the block, which behave exactly like local variables in a function.
Each invocation of the block provides a new copy of that variable. These variables can in turn be used as
const
or by-reference variables in blocks enclosed within the block.
The __block Storage Type
You can specify that an imported variable be mutable—that is, read-write— by applying the
__block
storage type modifier.__block
storage is similar to, but mutually exclusive of, theregister
,auto
, andstatic
storage types for local variables.__block
variables live in storage that is shared between the lexical scope of the variable and all blocks and block copies declared or created within the variable’s lexical scope. Thus, the storage will survive the destruction of the stack frame if any copies of the blocks declared within the frame survive beyond the end of the frame (for example, by being enqueued somewhere for later execution). Multiple blocks in a given lexical scope can simultaneously use a shared variable.As an optimization, block storage starts out on the stack—just like blocks themselves do. If the block is copied using
Block_copy
(or in Objective-C when the block is sent acopy
), variables are copied to the heap. Thus, the address of a__block
variable can change over time.There are two further restrictions on
__block
variables: they cannot be variable length arrays, and cannot be structures that contain C99 variable-length arrays.