As far as I understand a Block acts like an object, in that you can send copy or release messages to it, e.g:
[myBlock copy];
However whenever I do this, or release a block, I get EXC_BAD_ACCESS.
If I use the block functions, everything works as expected, e.g.:
Block_copy(myBlock);
I thought both ways of releasing and copying blocks were identical?
It's not that much of a problem, but it is a little annoying that if I have a property (copy) which is a Block, I have to write the setter method myself.
For example: With Properties:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
leads to EXC_BAD_ACCESS when setting cancelledBlock
but if I do:
//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);
}
there is no EXC_BAD_ACCESS and everything runs as it should.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…