这个问题参考这个问题:
How to simplify callback logic with a Block?
How to simplify callback logic with a Block?
我的标题有这些typedef
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,如[完成副本].其次,ARC将为您复制需要超过其初始化范围[1]的块,因此您不需要再次调用-copy.唯一的“异常”是块类型的属性仍然需要具有副本属性.
[1]:这里似乎需要澄清.当编译器看到它需要超过其初始化范围时,ARC才隐式地复制块.这基本上意味着当它分配给一个转义当前范围的变量(在父范围中声明的堆栈变量,实例变量,静态等)时.但是,如果作为参数传递给方法/函数,则编译器不会进行任何自动复制.通常这不是一个问题,因为需要将块保持在块框架(dispatch_async(),完成块等)上的块感知方法/函数将为您复制它们.但是,不具有阻止意识的API(例如NSArray)将不会隐式地复制该块,因为它们希望一个简单的-retain将会做到这一点.如果您将块传递给非阻塞感知API,并且块需要超过当前范围,则必须使用显式的-copy.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。