Under ARC, are Blocks automatically copied when as

2019-02-06 20:02发布

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.

2条回答
男人必须洒脱
2楼-- · 2019-02-06 20:41

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];
查看更多
对你真心纯属浪费
3楼-- · 2019-02-06 20:47

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

查看更多
登录 后发表回答