このようなことをします:
void func(void *q)
{
NSObject* o = CFBridgingRelease(q);
NSLog(@"%@", o);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSObject* o = [NSObject new];
func((void*)CFBridgingRetain(o));
}
return 0;
}
CFBridgingRetain()
とCFBridgingRelease()
はコンパイラ属性の周りのマクロであることに注意してください。どちらでもお気軽にご利用ください。APIバリアントは、コードベースでより一般的に使用されており、より明示的で混乱が少ないため、気に入っています。
CFBridgingRetain()
によってバランスをとる必要があるオブジェクトを効果的にハード保持しますCFBridgingRelease()
。また、へのキャストと互換性のあるaCFTypeRef
を返すこともあります。 そのハードリテンションを効果的に元に戻すため、有効なスコープ内でのみ有効なままになります。void*
CFBridgingRelease()
q
o
基本的なコールバックには有効ですがvoid *context;
、しばらくの間固執しなければならないタイプのものではおそらくそうではないでしょう。そのために:
void callback(void *context)
{
// grab an ARC aware reference without impacting hard-retain
NSObject* o = (__bridge NSObject *)(context);
NSLog(@"%@", o);
}
void freeContext(void *context)
{
// release the hard-retain
CFBridgingRelease(context);
}
Xcodeは、キャスト/API呼び出しを省略した場合に何をすべきかを正確に提案するのに非常に優れていることに注意してください。それは、それぞれの代替ソリューションの意味を説明しています(私は、頭の中でまっすぐに保つことができるまで、これに大きく依存していました)。