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 becauseaddObject:
's argument type isid
:bearMountain,
The easiest way to ensure the block is copied is to, in fact, set the
@property
to use copy. As in:It does everything you need.
Andrew