在ARC下,当通过属性分配给ivar时,是否会自动复制块?

时间:2012-05-02 16:28:14

标签: objective-c properties automatic-ref-counting objective-c-blocks

假设

typedef void (^MyResponseHandler) (NSError *error);
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler;
synthesize ivarResponseHandler = _ivarResponseHandler;

- (void)myMethod:(MyResponseHandler)responseHandler
{
    self.ivarResponseHandler = responseHandler;
    ...
}

通过@property对ivar的分配是否正确?我知道在手动内存管理中,您需要self.ivarResponseHandler = [responseHandler copy];来确保将块从堆栈复制到堆中。但是,观看会议322 - 来自WWDC 2011的会议-C深度进展(第25分钟),发言人说ARC自动处理将块分配给ivar。我只是想确定一下。

2 个答案:

答案 0 :(得分:11)

ARC 在您发布的代码中自动为您执行副本。

如果您将该块转换为id,ARC将为您执行复制。例如,在此代码中,ARC将不执行复制,因为addObject:的参数类型为id

NSMutableArray *array = [NSMutableArray array];
[array addObject:responseHandler];

答案 1 :(得分:2)

bearMountain,

确保复制块的最简单方法是将@property设置为使用副本。如:

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler;

它可以满足您的一切需求。

安德鲁