假设
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。我只是想确定一下。
答案 0 :(得分:11)
ARC 将在您发布的代码中自动为您执行副本。
如果您将该块转换为id
,ARC将不为您执行复制。例如,在此代码中,ARC将不执行复制,因为addObject:
的参数类型为id
:
NSMutableArray *array = [NSMutableArray array];
[array addObject:responseHandler];
答案 1 :(得分:2)
bearMountain,
确保复制块的最简单方法是将@property
设置为使用副本。如:
@property (copy, nonatomic) MyResponseHandler ivarResponseHandler;
它可以满足您的一切需求。
安德鲁