Por lo que yo entiendo un bloque actúa como un objeto, en el que se puede enviar copia o liberar mensajes a ella, por ejemplo:EXC_BAD_ACCESS al copiar o retener Bloque
[myBlock copy];
Sin embargo cada vez que hago esto, o la liberación un bloque, obtengo EXC_BAD_ACCESS.
Si utilizo las funciones de bloque, todo funciona como se espera, por ejemplo .:
Block_copy(myBlock);
pensé en ambos sentidos de la descarga y los bloques de copia eran idénticos?
No es un gran problema, pero es un poco molesto que si tengo una propiedad (copia) que es un bloque, tengo que escribir el método setter yo mismo.
Por ejemplo: Con Propiedades:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
lleva a EXC_BAD_ACCESS al establecer cancelledBlock
pero si lo hago:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock; //saves me doing the getter as well
- (void)setCancelledBlock:(void (^)(void))aCancelledBlock {
if (cancelledBlock == aCancelledBlock) {
return;
}
void (^oldValue)(void) = cancelledBlock;
cancelledBlock = Block_copy(aCancelledBlock);
Block_release(oldValue);
}
no hay EXC_BAD_ACCESS y todo funciona como debería.
Solo debe liberar lo que retuvo o copió previamente. – Richard
Sé que, como digo en mi pregunta, tratando de hacer '[myBlock copy]' da EXC_BAD_ACCESS, pero 'Block_copy (myBlock)' no –
¿Puede mostrarnos un ejemplo completo? –