8

认为

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

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

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

4

2 回答 2

11

ARC在您发布的代码中自动为您执行复制。

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

NSMutableArray *array = [NSMutableArray array];
[array addObject:responseHandler];
于 2012-05-02T16:35:28.957 回答
2

熊山,

事实上,确保块被复制的最简单方法是将 设置@property为使用复制。如:

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler;

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

安德鲁

于 2012-05-04T13:06:02.713 回答