Objective-Cオブジェクト から CoreFoundationオブジェクトへのキャスト

(知らなかったのでメモ。。)

ARC環境下では、キャスト時に__bridgeがないと怒られる。

例:NSURL * から CFURLRef にキャスト

CFURLRef url = (__bridge CFURLRef)[NSURL URLWithString:@"path"]
理由

NS〜とかObjective-CのオブジェクトはARC対象だけど CoreFoundationは対象外だから。

上のCFURLRef urlは、 NSURLのオブジェクトがなくなる時(スコープ外に出る)まで有効。 変数の中にアドレスが残っていたとしてもアクセスしてはだめ。

O-Cオブジェクトが破棄された以後もCFオブジェクトを使用したい時は、 retainやオーナーシップ権を委譲するbridgeキャストがある。

参考

http://natsuapps.com/note/2011/11/ios5-arc-autorelease-bridge-xcode.html