6

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 关闭时程序崩溃。

4

1 回答 1

13

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

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

于 2016-05-18T22:31:54.183 回答