2011-08-18 16 views
16

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.

+0

Solo debe liberar lo que retuvo o copió previamente. – Richard

+0

Sé que, como digo en mi pregunta, tratando de hacer '[myBlock copy]' da EXC_BAD_ACCESS, pero 'Block_copy (myBlock)' no –

+0

¿Puede mostrarnos un ejemplo completo? –

Respuesta

26

Después de una larga y aburrida tarde y tarde finalmente encontré este answer here, aunque puede parecer no relacionado, la cadena de sitios web que visité para encontrarlo, crea esa relación.

Básicamente tuve que eliminar -weak_library /usr/lib/libSystem.B.dylib de las banderas del enlazador y reemplazarlo por -weak-lSystem.

+0

¡Gracias, Jonathan! ¡Después de más de 4 horas resolviste mi problema! –

+0

Whoa. Literalmente he pasado semanas intentando rastrear qué causaba que mi aplicación fallara al iniciarse en el simulador. Esta respuesta lo hizo. Muchas gracias! –

+0

Sé lo molesto que es este problema, solo me gustaría saber por qué funciona esta solución. –

Cuestiones relacionadas