objective blocks objective-c objective-c-blocks

objective c - blocks - ¿Cómo almacenar bloques en propiedades en Objective-C?



blocks objective c (3)

Alternativamente, sin el typedef

@property (copy, nonatomic) void (^selectionHandler) (NSDictionary*) ;

Me gustaría almacenar el bloque Object-C en una propiedad para su uso posterior. No estaba seguro de cómo hacerlo, así que busqué en Google un poco y hay muy poca información sobre el tema. Pero al final he logrado encontrar la solución y he pensado que valdría la pena compartirla con otros novatos como yo.

Inicialmente pensé que necesitaría escribir las propiedades a mano para usar Block_copy y Block_release.

Afortunadamente, descubrí que los bloques son NSObjects y - copy / - release es equivalente a Block_copy / Block_release . Entonces puedo usar @property (copy) para generar automáticamente setters y getters.


Puede encontrar una muy buena explicación de esto en la sesión 712 de WWDC 2012 a partir de la página 83. La forma correcta de guardar un bloque en ARC es la siguiente:

@property(strong) my_block_type work;

Tenga cuidado con los ciclos de retención. Una buena manera de resolver es establecer el bloque en cero cuando ya no lo necesite:

self.work = nil;


Editar: actualizado para ARC

typedef void(^MyCustomBlock)(void); @interface MyClass : NSObject @property (nonatomic, copy) MyCustomBlock customBlock; @end @implementation MyClass @end MyClass * c = [[MyClass alloc] init]; c.customBlock = ^{ NSLog(@"hello....."); } c.customBlock();