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.
È necessario rilasciare solo ciò che è stato conservato o copiato in precedenza. – Richard
So che, come ho detto nella mia domanda cercando di fare '[myBlock copy]' dà EXC_BAD_ACCESS, ma 'Block_copy (myBlock)' non è –
Puoi mostrarci un esempio completo? –