【问题标题】:How to Convert NSURL to CFURLRef如何将 NSURL 转换为 CFURLRef
【发布时间】:2016-08-15 07:54:46
【问题描述】:

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 file:///Users/xxxxxx/Documents/xxxnalysis.pdf

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

【问题讨论】:

  • 崩溃情况如何?沙盒日志中是否有任何错误?
  • 我找到了答案。如果您不使用 CFStringCreateWithCString 创建 CFStringRef 。你不需要调用 CFRelease(url);

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


【解决方案1】:

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

【讨论】:

  • 如何在 Swift 中做到这一点?使用 CFBridgingRetain 会导致运行时错误,使用 (__bridge CFURLRef) 会导致编码错误。
  • 显然,在 Swift 中,这些类型已经桥接到本机对象,所以你应该能够强制转换它。见en.swifter.tips/toll-free
  • 我试过了。它不起作用,但我找到了一种更简单的方法来解决我想做的事情。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 2011-09-01
  • 2011-12-26
  • 1970-01-01
  • 2013-03-25
  • 2014-10-14
  • 2016-05-05
  • 2014-10-25
相关资源
最近更新 更多