为什么Objective-C块仍然工作,而不复制到堆?

我在class上有一个简单的方法:

- (void)getFormWithBlock:(DataCenterResultBlock)block { [SomeClass doSomeLongOperationWithParam:someParam completionBlock:^(NSData *data, NSURLResponse *response) { //Success block(aVar, YES); } errorBlock:^(NSError *error) { //Failed block(nil, NO); }]; } 

我读过你应该将块复制到堆中,如果你正在asynchronous做某些事情,因为它们被分配到堆栈上,一旦调用树回滚它就会消失。

但是在这里,我不是把它复制成堆,但我仍然没有崩溃。 为什么? 谢谢

ARC编译器自动将块variables复制到堆中 :

7.5。 块

保留对象所有者types的__blockvariables通过从堆栈副本移出的结果初始化堆副本从而移出堆栈。

编辑我想我误解了这个问题:你问块对象本身 ,而不是块variables 。 这种情况下的答案略有不同,但归结起来,ARC自动做出正确的事情。

ARC知道,如果在当前范围返回之后使用块文字,则块文字必须被复制。 非ARC代码需要显式复制和自动释放返回的块:

 return [[^{ DoSomethingMagical(); } copy] autorelease]; 

用ARC,这只是变成:

 return ^{ DoSomethingMagical(); }; 

(从这里 )

[SomeClass doSomeLongOperationWithParam:completionBlock:errorBlock:]应该复制完成和错误块。

如果你看一下这个方法的实现,可能是做正确的事情,并复制你传入的块。ARC或没有ARC,该方法应该复制这些块。