为什么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,该方法应该复制这些块。