zei*_*sen 9 objective-c ios objective-c-blocks automatic-ref-counting
本课题引用了这个问题: 如何用块简化回调逻辑?
我的标题有这些typedef
typedef void (^StuffDoneBlock)(NSDictionary * parsedData);
typedef void (^StuffFailedBlock)(NSError * error);
Run Code Online (Sandbox Code Playgroud)
并在初始化
stuffDoneCallback = Block_copy(done);
StuffFailedCallback = Block_copy(error);
Run Code Online (Sandbox Code Playgroud)
在本文中,它说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__)))
^~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
Lil*_*ard 22
首先,你为什么要使用Block_copy()?除非你正在编写原始C,否则你应该调用-copy块,就像在[done copy].其次,ARC将为您复制需要超出其初始化范围的块[1],因此您甚至不需要再调用-copy.唯一的"例外"是块类型属性仍然需要具有该copy属性.
[1]:这里似乎需要澄清.当编译器发现它需要超过其初始化范围时, ARC仅隐式复制块.这基本上意味着它被分配给一个逃避当前范围的变量(在父范围,实例变量,静态等中声明的堆栈变量).但是,如果它作为参数传递给方法/函数,则编译器不会执行任何自动复制.通常这不是问题,因为需要通过堆栈帧(dispatch_async()完成块等)保持块的块感知方法/函数将为您复制它们.但是,不支持块的API (例如NSArray)不会隐式复制块,因为它们期望一个简单的方法-retain可以解决这个问题.如果您将块传递给非块感知API并且块需要经过当前范围,则必须使用显式-copy.
| 归档时间: |
|
| 查看次数: |
7109 次 |
| 最近记录: |