首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 5数据块弧形桥接转换

iOS 5数据块弧形桥接转换
EN

Stack Overflow用户
提问于 2011-10-11 17:23:53
回答 1查看 7.2K关注 0票数 9

这个问题引用了这个问题:How to simplify callback logic with a Block?

我的标头有这些typedefs

代码语言:javascript
复制
typedef void (^StuffDoneBlock)(NSDictionary * parsedData);
typedef void (^StuffFailedBlock)(NSError * error);

在init中

代码语言:javascript
复制
stuffDoneCallback = Block_copy(done);
StuffFailedCallback = Block_copy(error);

在本文中,它说Block_copy是不必要的。但是,它需要一个桥接的造型。编译器消息如下:

代码语言:javascript
复制
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__)))
                                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-12 05:09:04

首先,你为什么要使用Block_copy()?除非你在写原始的C,否则你应该像在[done copy]中一样,在块上调用-copy。其次,ARC会为你复制那些需要在初始化scope1后存活的块,所以你甚至不需要再调用-copy了。唯一的“例外”是块类型的属性仍然需要有copy属性。

1:这里似乎需要澄清。ARC仅在编译器发现它需要存在于其初始化作用域之后时才会隐式复制块。这基本上意味着当它被赋值给一个脱离当前作用域的变量时(在父作用域中声明的堆栈变量、实例变量、静态变量等)。但是,如果将其作为参数传递给方法/函数,则编译器不会进行任何自动复制。通常这不是问题,因为块感知的方法/函数需要在堆栈帧之后保留块(dispatch_async()、完成块等)。将为您复制它们。但是,不能识别块的API(如NSArray)不会隐式复制块,因为它们期望一个简单的-retain就能做到这一点。如果要将块传递给不支持块的应用编程接口,并且该块需要存在于当前作用域之外,则必须使用显式-copy

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7723864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档