Guardar un bloque en variable de instancia

¿Cómo declaramos una global (variable de instancia privada) para aceptar un bloque en ella. ¿Necesitamos sintetizarlo y cuáles son las implicaciones de la gestión de la memory con él?

Tengo un bloque recibido de un método de terceros que quiero save en la variable de instancia y lo uso en una etapa posterior.

Aquí hay un ejemplo (sin ARC) de almacenar un bloque para una callback de finalización después de realizar un trabajo en segundo plano:

Trabajador.h:

@interface Worker : NSObject { void (^completion)(void); } @property(nonatomic,copy) void (^completion)(void); - (void)workInBackground; @end 

Worker.m:

 @implementation Worker @synthesize completion; - (void)dealloc { Block_release(completion); [super dealloc]; } - (void)setCompletion:(void (^)(void))block { if ( completion != NULL ) Block_release(completion); completion = Block_copy(block); } - (void)workInBackground { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { // Do work.. dispatch_async(dispatch_get_main_queue(), completion); }); } @end 

Consulte Blocks Programming Topics :

Puede copyr y liberar bloques con las funciones C:

 Block_copy(); Block_release(); 

Si está utilizando Objective-C, puede enviar posts de copy bloque, retain y release (y autorelease ).

Para evitar una pérdida de memory, siempre debe equilibrar un Block_copy() con Block_release() . Debe equilibrar la copy o retain con la release (o la autorelease ), a less que se encuentre en un entorno recolectado en la basura.