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