Assume
typedef void (^MyResponseHandler) (NSError *error);
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler;
synthesize ivarResponseHandler = _ivarResponseHandler;
- (void)myMethod:(MyResponseHandler)responseHandler
{
self.ivarResponseHandler = responseHandler;
...
}
Is the assignment to the ivar through the @property correct? I know that in manual memory management you would have needed self.ivarResponseHandler = [responseHandler copy]; to make sure the block was copied from the stack to the heap. But watching Session 322 - Objective-C Advancements in Depth (minute 25) from WWDC 2011, the speaker says that ARC automatically handles the assignment of a block to an ivar. I just wanted to make sure.
ARC will automatically perform the copy for you in the code you posted.
If you convert the block to an id, ARC will not perform the copy for you. For example, in this code, ARC will not perform the copy because addObject:'s argument type is id:
NSMutableArray *array = [NSMutableArray array];
[array addObject:responseHandler];
bearMountain,
The easiest way to ensure the block is copied is to, in fact, set the @property to use copy. As in:
@property (copy, nonatomic) MyResponseHandler ivarResponseHandler;
It does everything you need.
Andrew
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With