What does the "__block" keyword mean?

ios, objective-c, objective-c-blocks

Solution

It tells the compiler that any variable marked by it must be treated in a special way when it is used inside a block. Normally, variables and their contents that are also used in blocks are copied, thus any modification done to these variables don't show outside the block. When they are marked with `__block`, the modifications done inside the block are also visible outside of it.

For an example and more info, see The __block Storage Type in Apple's Blocks Programming Topics.

The important example is this one:

extern NSInteger CounterGlobal;
static NSInteger CounterStatic;

{
    NSInteger localCounter = 42;
    __block char localCharacter;

    void (^aBlock)(void) = ^(void) {
        ++CounterGlobal;
        ++CounterStatic;
        CounterGlobal = localCounter; // localCounter fixed at block creation
        localCharacter = 'a'; // sets localCharacter in enclosing scope
    };

    ++localCounter; // unseen by the block
    localCharacter = 'b';

    aBlock(); // execute the block
    // localCharacter now 'a'
}

In this example, both `localCounter` and `localCharacter` are modified before the block is called. However, inside the block, only the modification to `localCharacter` would be visible, thanks to the `__block` keyword. Conversely, the block can modify `localCharacter` and this modification is visible outside of the block.

Problem

What exactly does the `__block` keyword in Objective-C mean? I know it allows you to modify variables within blocks, but I'd like to know... - What exactly does it tell the compiler? - Does it do anything else? - If that's all it does then why is it needed in the first place? - Is it in the docs anywhere? (I can't find it).

Original source

Related problems