如何将NSURL转换为CFURLRef

cod*_*ero 5 pdf-generation operating-system 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);
Run Code Online (Sandbox Code Playgroud)

输出是

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);
Run Code Online (Sandbox Code Playgroud)

输出是

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

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

dga*_*ood 11

CFURLRef并且NSURL是免费的桥接.通常,你会这样做:

NSURL *url = ...;
CFURLRef cfurl = CFBridgingRetain(url);
Run Code Online (Sandbox Code Playgroud)

当您不再需要CFURL对象时:

CFRelease(cfurl);
Run Code Online (Sandbox Code Playgroud)

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

CFURLRef cfurl = (__bridge CFURLRef)url;
Run Code Online (Sandbox Code Playgroud)

如果你遇到了崩溃,这可能意味着你过度释放了某些东西 - 具体来说,你发布了一个你不拥有的对象.我建议阅读Apple关于对象所有权的文档:

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