iOS 5阻止ARC桥接

这个问题引用这个问题: 如何简化callback逻辑与块?

我的标题有这些typedefs

typedef void (^StuffDoneBlock)(NSDictionary * parsedData); typedef void (^StuffFailedBlock)(NSError * error); 

并在初始化

 stuffDoneCallback = Block_copy(done); StuffFailedCallback = Block_copy(error); 

在这篇文章中说Block_copy是不必要的。 但是,那么它需要一个桥梁铸造。 编译器的消息如下:

 error: cast of block pointer type 'StuffDoneBlock' (aka 'void (^)(NSDictionary *__strong)') to C pointer type 'const void *' requires a bridged cast [4] stuffDoneCallback = _bridge(Block_copy(done)); ^~~~~~~~~~~~~~~~ /Developer-4.2/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/usr/include/Block.h:60:61: note: instantiated from: #define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__))) ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 

首先,为什么你甚至使用Block_copy() ? 除非你正在编写原始的C语言,否则你应该在块上调用-copy ,就像在[done copy] 。 其次,ARC会为你复制需要超过其初始化范围的块,所以你甚至不需要再调用-copy 。 唯一的“例外”是块types的属性仍然需要具有copy属性。

[1]:澄清似乎需要在这里。 当编译器发现它需要超过它的初始化范围时 ARC只隐式地复制块。 这基本上意味着什么时候它被分配给一个variables来逃避当前范围(在父范围,实例variables,静态等声明的堆栈variables)。 但是,如果它作为parameter passing给方法/函数,则编译器不会执行任何自动复制。 通常情况下,这不是问题,因为需要保留在栈框架( dispatch_async() ,完成块等)上的块感知方法/函数将复制它们给你。 但是, 不能 NSArray API(如NSArray )不会隐式地复制块,因为他们期望简单的-retain就可以实现。 如果将块传递给非块感知API,并且块需要超过当前范围,则必须使用明确的-copy