Насколько я понимаю, блок действует как объект, в котором вы можете отправлять ему копии или выпускать сообщения, например:
[myBlock copy];
Однако всякий раз, когда я делаю это, или освобождаю блок, я получаю EXC_BAD_ACCESS.
Если я использую функции блока, все работает так, как ожидалось, например:
Block_copy(myBlock);
Я думал, что оба способа освобождения и копирования блоков были идентичны?
Это не такая уж большая проблема, но немного раздражает, что если у меня есть свойство (копия), которое является блоком, я должен сам написать метод setter.
Например: С помощью свойств:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
приводит к EXC_BAD_ACCESS при установке cancelledBlock
но если я это сделаю:
//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);
}
нет EXC_BAD_ACCESS, и все работает так, как должно быть.