2016-04-21 66 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

相关问题