私は標準のCAPIにObj-Cラッパーを書いています。Cコールバックをブロックに置き換えたいと思います。
CAPIを想像してみましょう。
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);
}
それをコンパイラのバグと呼べますか?そうでない場合、コンパイラはどのようなルールに従いますか?
同様のトピック: