¿Qué significa la palabra clave "__block"?

Resuelto mjisrawi asked hace 54 años • 8 respuestas

¿ Qué significa exactamente la __blockpalabra clave en Objective-C? Sé que te permite modificar variables dentro de los bloques, pero me gustaría saber...

  1. ¿Qué le dice exactamente al compilador?
  2. ¿Hace algo más?
  3. Si eso es todo lo que hace, ¿por qué es necesario en primer lugar?
  4. ¿Está en los documentos en alguna parte? (No puedo encontrarlo).
mjisrawi avatar Jan 01 '70 08:01 mjisrawi
Aceptado

Le dice al compilador que cualquier variable marcada por él debe tratarse de manera especial cuando se usa dentro de un bloque. Normalmente, las variables y su contenido que también se utilizan en los bloques se copian, por lo que cualquier modificación realizada a estas variables no se muestra fuera del bloque. Cuando están marcados con __block, las modificaciones realizadas dentro del bloque también son visibles fuera del mismo.

Para ver un ejemplo y más información, consulte El tipo de almacenamiento __block en los temas de programación de bloques de Apple .

El ejemplo importante es este:

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'
}

En este ejemplo, tanto localCountery localCharacterse modifican antes de llamar al bloque. localCharacterSin embargo, dentro del bloque, solo sería visible la modificación de , gracias a la __blockpalabra clave. Por el contrario, el bloque puede modificarse localCharactery esta modificación es visible fuera del bloque.

DarkDust avatar Aug 16 '2011 15:08 DarkDust

@bbum cubre los bloques en profundidad en una publicación de blog y toca el tipo de almacenamiento __block.

__block es un tipo de almacenamiento distinto

Al igual que estático, automático y volátil, __block es un tipo de almacenamiento. Le dice al compilador que el almacenamiento de la variable se debe administrar de manera diferente.

...

Sin embargo, para las variables __block, el bloque no se retiene. Depende de usted retener y liberar, según sea necesario.
...

En cuanto a los casos de uso, encontrará __blockque a veces se utiliza para evitar ciclos de retención, ya que no retiene el argumento. Un ejemplo común es el uso de uno mismo.

//Now using myself inside a block will not 
//retain the value therefore breaking a
//possible retain cycle.
__block id myself = self;
Joe avatar Aug 16 '2011 15:08 Joe