2012-07-11 4 views
7

Tengo un método simple de mi clase:¿Por qué el bloque Objective-C todavía funciona sin copiarlo en el montón?

- (void)getFormWithBlock:(DataCenterResultBlock)block { 
    [SomeClass doSomeLongOperationWithParam:someParam 
            completionBlock:^(NSData *data, NSURLResponse *response) { 
             //Success 
             block(aVar, YES); 
            } errorBlock:^(NSError *error) { 
             //Failed 
             block(nil, NO); 
            }]; 
} 

leí que copie bloques al montón si se está haciendo algo de manera asíncrona, ya que se asignan en la pila y una vez que el árbol de llamadas rebobina habrán desaparecido .

Pero aquí, no lo estoy copiando a montones, pero todavía no me cuelgo. ¿Por qué? Gracias

+1

¿estás usando ARC? – RolandasR

+0

Sí, estoy usando ARC – 0xSina

Respuesta

9

Block variables are copied to the heap automatically by ARC compilers:

7,5. Bloques

... variables de

__block de retainable tipo de propietario del objeto se mueven fuera de la pila mediante la inicialización de la copia montón con el resultado de pasar de la copia pila.

EDITAR creo que no he entendido bien la pregunta: ¿se preguntó acerca de Objetos de bloques a sí mismos, no bloquear las variables . La respuesta en este caso es ligeramente diferente, pero se reduce a lo mismo: ARC hace lo correcto automáticamente.

ARC sabe que los literales de bloque se deben copiar si se usan después de que se devuelve el alcance actual. código no ARC necesita para copiar de manera explícita y autorelease volvió bloques:

return [[^{ 
    DoSomethingMagical(); 
} copy] autorelease]; 

Con ARC, esto simplemente se convierte en:

return ^{ DoSomethingMagical(); }; 

(desde here)

+0

Solo para el beneficio de otros que leen esta respuesta, la respuesta no coincide con la pregunta aquí (probablemente solo se haya leído mal). La pregunta es sobre pasar un bloque asignado de pila a otro método. La respuesta se refiere a la captura de variables __block dentro de un bloque. Esos son dos temas diferentes. –

+0

@FirozeLafeer Tienes toda la razón, leí mal la pregunta. Lo edité para responder la pregunta real esta vez :) ¡Gracias! – dasblinkenlight

1

[SomeClass doSomeLongOperationWithParam:completionBlock:errorBlock:] debe estar copiando los bloques de finalización y error.

Si observa la implementación de ese método, probablemente esté haciendo lo correcto y copiando el bloque que ingresó. ARC o no ARC, ese método debe copiar esos bloques.

Cuestiones relacionadas