【发布时间】:2012-07-31 10:38:38
【问题描述】:
我正在为标准 C API 编写一个 Obj-C 包装器。我想用块替换 C 回调。
让我们想象一个 C API:
void my_async_function(void (* callback)(void *), void *udata);
Obj-C 包装器如下所示:
- (void)myAsyncFunction:(dispatch_block_t)block
{
void *udata = (__bridge_retained void *)block;
my_async_function(my_callback, udata);
}
void my_callback(void *udata)
{
dispatch_block_t block = (__bridge_transfer dispatch_block_t)udata;
block();
}
__bridge_retained 和 __bridge_transfer 在很多情况下都能正常工作,但在块上,它们会导致非常奇怪的行为。
myAsyncFunction 的汇编代码:完全没有保留(Xcode 4.4,ARC,O3)。
非常奇怪的是,下面的核心,生成了一个objc_retainBlock,这是我对myAsyncFunction的期望:
void *a_global_var;
- (void)myAsyncFunction2:(dispatch_block_t)block
{
void *udata = (__bridge_retained void *)block;
a_global_var = udata;
my_async_function(my_callback, udata);
}
我们可以称之为编译器的错误吗? 如果不是,编译器遵循什么规则?
类似主题:
【问题讨论】:
标签: objective-c ios5 automatic-ref-counting objective-c-blocks