根据ARC,在分配给通过属性伊娃是块自动复制?(Under ARC, are Blocks auto

2019-06-24 03:04发布

假设

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

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

通过分配给伊娃@property是否正确? 我知道,在手动内存管理,你会需要self.ivarResponseHandler = [responseHandler copy]; 以确保块从堆栈堆复制。 但在观看会话322 - Objective-C的进步在2011年WWDC深度(25分钟),扬声器说,ARC自动处理块到伊娃的分配。 我只是想确认一下。

Answer 1:

bearMountain

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

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler;

它做你需要的一切。

安德鲁



Answer 2:

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

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

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


文章来源: Under ARC, are Blocks automatically copied when assigned to an ivar via the property?