2011-10-31 12 views

Respuesta

4

El objetivo de los bloques era hacerlo lo más automático y transparente posible para usar bloques con una sintaxis mínima y hacer que "simplemente funcionen".

Las variables de bloque no__, como el predeterminado, están mucho más en línea con la noción de "cierres" que representan los bloques. Una instantánea de bloque muestra el estado de todas las variables a las que se hace referencia dentro del bloque en el momento en que la ejecución pasa sobre la declaración de bloque. Esto abarca tanto la copia de memoria/estado como la retención de cualquier referencia de objeto Objective-C capturada en el bloque.

__block efectivamente rompe la encapsulación de estado dentro del bloque. Muy útil, pero requiere la administración manual de referencias de objetos por parte del programador.

I.e. las variables de bloque no__ "simplemente funcionan" más a menudo las variables __block y, por lo tanto, el comportamiento predeterminado era gravitar a "simplemente funciona".

En la práctica, el costo de capturar el estado dentro de un bloque suele ser mínimo. El impacto mensurable en el rendimiento de la aplicación suele ser raro y, a menudo, indica un problema arquitectónico de naturaleza más profunda.


Si por:

__block SelfClass * blockSelf = self; 

¿Está usted se refiere a la cruz-producto de Bloques y ARC? Sí, eso es un poco desafortunado. Pero el compilador también advierte sobre un problema muy real que debe tener en cuenta. Sin embargo, una solución más limpia sería obviamente preferible.

0

Porque __block podría sobrevivir a la destrucción de la pila. Esto sólo será perceptible con C++ con ámbito variables:

{ 
    __block shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will not be deleted until the block is destructed 
{ 
    shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will be deleted here 

También es notable con la recolección de basura, pero es mucho menos perceptible y difícil de hacer ejemplo de.

+0

No del todo; en ambos casos, el bloque es un bloque de ámbito de pila y, por lo tanto, se destruirá con el alcance. Tienes que copiar el bloque para que sobreviva al alcance. Además, esto no es más que un pequeño detalle de '__block'; hay guerra muchos otros factores de conducción. – bbum

Cuestiones relacionadas