iphone - EXC_BAD_ACCESS al copiar o retener Bloque
objective-c exc-bad-access (1)
Según tengo entendido, un Bloque actúa como un objeto, ya que puede enviarle mensajes de copia o liberación, por ejemplo:
[myBlock copy];
Sin embargo, cada vez que hago esto, o libero un bloque, obtengo EXC_BAD_ACCESS.
Si utilizo las funciones de bloqueo, todo funciona como se espera, por ejemplo:
Block_copy(myBlock);
¿Pensé que ambas formas de liberar y copiar bloques eran idénticas?
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 de establecimiento yo mismo.
Por ejemplo: Con Propiedades:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
lleva a EXC_BAD_ACCESS cuando se configura 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.
Después de una tarde y una tarde largas y aburridas, finalmente encontré esta respuesta aquí , aunque puede parecer que no tiene relación, la cadena de sitios web que visité para encontrarla crea esa relación.
Básicamente tuve que eliminar -weak_library /usr/lib/libSystem.B.dylib
de las banderas del vinculador y reemplazarlo con -weak-lSystem
.