2012-01-12 43 views
7

弧遷移工具時遇到問題與此:如果我將自動釋放對象橋接到Core Foundation,我必須使用__bridge還是__bridge_retained?

NSURL *fileURL = [NSURL fileURLWithPath:path]; 
AudioFileOpenURL((CFURLRef)fileURL, kAudioFileReadPermission, 0, &fileID); 

特別是,它是不知道它是否應該做一個__bridge或__bridge_retained。我也是。

-fileURLWithPath返回一個自動釋放對象,在這個地方我不是fileURL的所有者。但與此同時,該對象的保留計數至少爲+1。

我敢打賭,這隻能用__bridge來完成。

回答

12

您只想爲此使用常規__bridge強制轉換。僅當您想要管理強制轉換CF對象的生命週期時,纔會使用__bridge_retained。例如:

CFStringRef cf_string = (__bridge_retained CFStringRef)someNSString; 
// some long time later, perhaps in another method etc 
CFRelease(cf_string); 

所以__bridge_retained真正告訴你有一個ARC對象的編譯器,現在你想基本上把它變成你要直接管理一個CF對象。

相關問題