O ile mi zrozumieć Blok działa jak przedmiot, na który można wysłać kopię lub zwolnić wiadomości do niego, np:EXC_BAD_ACCESS podczas kopiowania lub zachowaniu Blok
[myBlock copy];
Jednak ilekroć to zrobić, lub uwalnianie blok, dostaję EXC_BAD_ACCESS.
Jeśli używam funkcji blokowych, wszystko działa zgodnie z oczekiwaniami, np .:
Block_copy(myBlock);
Myślałem oba sposoby uwalniania i blokuje kopiowania były identyczne?
To nie jest żaden problem, ale jest trochę irytujące, że jeśli mam własność (kopię), która jest blokiem, muszę napisać metodę ustawiacza samodzielnie.
Na przykład: Z Właściwości:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
prowadzi do EXC_BAD_ACCESS podczas ustawiania cancelledBlock
ale jeśli robię:
//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);
}
nie ma EXC_BAD_ACCESS i wszystko działa tak jak powinno.
Powinieneś zwolnić to, co wcześniej zatrzymałeś lub skopiowałeś. – Richard
Wiem, że jak mówię w moim pytaniu próbującym zrobić "[myBlock copy]" daje EXC_BAD_ACCESS, ale 'Block_copy (myBlock)' nie jest –
Czy możesz pokazać nam pełny przykład? –