Насколько я понимаю, блок действует как объект, в котором вы можете отправлять ему сообщения о копировании или выпуске, например:
[myBlock copy];
Однако всякий раз, когда я делаю это или освобождаю блок, яget EXC_BAD_ACCESS.
Если я использую функции блока, все работает как положено, например:
Block_copy(myBlock);
Я думал, что оба способа освобождения и копирования блоков были идентичны?
Это не такая большая проблема, но это немного раздражает, что если у меня есть свойство (копия), которое является Блоком, я должен сам написать метод установки.
Например: With Properties:
//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 не будет, и все будет работать как надо.