2016-04-21 65 views
3

Apple爲創建PDF文檔提供了示例代碼。但它使用CFURLRef如何將NSURL轉換爲CFURLRef

NSPanel savepanel給NSURL。

我不能轉換到NSURL CFURLRef

path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8); 

url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0); 
NSLog(@"CFURLRef %@",url); 

輸出是

2016年4月22日00:34:26.648 XXX分析[12242:813106] CFURLRef AnalysisReport.pdf - 文件: ///Users/xxxxxx/Library/Containers/com.xxxxxx.xxxnalysis/Data/

轉換代碼,我發現

url = (__bridge CFURLRef)theFile; 
NSLog(@"NSURL %@",url); 

輸出是

2016年4月22日00:37:20.494 XXX分析[12325:816505] NSURL文件:///Users/xxxxxx/Documents/xxxnalysis.pdf

在端PDF文件保存但NSPanel關閉時程序崩潰。

+0

如何崩潰的樣子?沙盒日誌中的任何錯誤? –

+0

我找到了我的答案。如果您不使用CFStringCreateWithCString創建CFStringRef。你不需要調用CFRelease(url); – codezero

回答

9

CFURLRefNSURL是免費橋接的。所以通常情況下,你會只是這樣做:

NSURL *url = ...; 
CFURLRef cfurl = CFBridgingRetain(url); 

而當你不再需要CFURL對象:

CFRelease(cfurl); 

或者如果你有理由確信NSURL將堅持足夠長的時間,你可以做

CFURLRef cfurl = (__bridge CFURLRef)url; 

如果你得到一個崩潰,這可能意味着你過度釋放的東西 - 特別是,你將要發佈一個對象,你沒有自己。我建議閱讀對象所有權蘋果的文檔:

https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html

相關問題