2011-08-18 19 views
16

Per quanto ho capito un blocco agisce come un oggetto, nel senso che è possibile inviare copia o rilasciare i messaggi ad esso, ad esempio:EXC_BAD_ACCESS durante la copia o mantenere Blocca

[myBlock copy]; 

Tuttavia ogni volta che faccio questo, o rilascio un blocco, ottengo EXC_BAD_ACCESS.

Se uso le funzioni di blocco, tutto funziona come previsto, ad es .:

Block_copy(myBlock); 

ho pensato entrambi i modi di liberare e blocca la copia erano identici?

Non è un gran problema, ma è un po 'fastidioso che se ho una proprietà (copia) che è un blocco, devo scrivere il metodo setter da solo.

Ad esempio: Con Proprietà:

//Header 
@property (nonatomic, copy) void (^cancelledBlock)(void); 

//Implementation 
@sythesize cancelledBlock; 

porta a EXC_BAD_ACCESS quando si imposta cancelledBlock

ma se lo faccio:

//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); 

} 

non c'è EXC_BAD_ACCESS e tutto gira come dovrebbe.

+0

È necessario rilasciare solo ciò che è stato conservato o copiato in precedenza. – Richard

+0

So che, come ho detto nella mia domanda cercando di fare '[myBlock copy]' dà EXC_BAD_ACCESS, ma 'Block_copy (myBlock)' non è –

+0

Puoi mostrarci un esempio completo? –

risposta

26

Dopo un lungo e noioso pomeriggio e sera ho finalmente trovato questo answer here, anche se può sembrare non correlato, la catena di siti Web che ho visitato per trovarlo, crea quella relazione.

Fondamentalmente ho dovuto rimuovere -weak_library /usr/lib/libSystem.B.dylib dalle bandiere del linker e sostituirlo con -weak-lSystem.

+0

Grazie, Jonathan! Dopo oltre 4 ore hai risolto il mio problema! –

+0

Whoa. Ho letteralmente trascorso settimane intere a rintracciare ciò che stava causando l'arresto anomalo della mia app durante l'avvio nel simulatore. Questa risposta l'ha fatto. Grazie mille! –

+0

So quanto sia fastidioso questo problema, vorrei solo sapere perché questa soluzione funziona. –

Problemi correlati