如何将NSURL转换为CFURLRef

时间:2016-04-21 21:45:01

标签: operating-system pdf-generation nsurl nssavepanel nspanel

Apple提供了创建PDF文档的示例代码。但它使用CFURLRef

NSPanel savepanel提供NSURL。

我无法将NSURL转换为CFURLRef

 path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8);

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

输出

2016-04-22 00:34:26.648 XXX分析[12242:813106] CFURLRef AnalysisReport.pdf - file:///Users/xxxxxx/Library/Containers/com.xxxxxx.xxxnalysis/Data/

转换我找到的代码

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

输出

2016-04-22 00:37:20.494 XXX分析[12325:816505] NSURL文件:///Users/xxxxxx/Documents/xxxnalysis.pdf

最后保存PDF文件但NSPanel关闭时程序崩溃。

1 个答案:

答案 0 :(得分:10)

CFURLRefNSURL是免费桥接的。通常情况下,你会这样做:

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

当你不再需要CFURL对象时:

CFRelease(cfurl);

或者,如果你有理由确定NSURL会坚持到足够长的时间,你就可以做到

CFURLRef cfurl = (__bridge CFURLRef)url;

如果您发生了崩溃,这可能意味着您过度发布了某些内容 - 具体而言,您发布了一个您不拥有的对象。我建议阅读Apple关于对象所有权的文档:

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