¿Qué significa la palabra clave "__block"?
¿ Qué significa exactamente la __block
palabra clave en Objective-C? Sé que te permite modificar variables dentro de los bloques, pero me gustaría saber...
- ¿Qué le dice exactamente al compilador?
- ¿Hace algo más?
- Si eso es todo lo que hace, ¿por qué es necesario en primer lugar?
- ¿Está en los documentos en alguna parte? (No puedo encontrarlo).
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 localCounter
y localCharacter
se modifican antes de llamar al bloque. localCharacter
Sin embargo, dentro del bloque, solo sería visible la modificación de , gracias a la __block
palabra clave. Por el contrario, el bloque puede modificarse localCharacter
y esta modificación es visible fuera del bloque.
@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á __block
que 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;