5

Apple gives sample code for Creating PDF document. But It uses CFURLRef

NSPanel savepanel gives NSURL.

I can't convert NSURL to CFURLRef

 path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8);

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

output is

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

convert code which i find

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

output is

2016-04-22 00:37:20.494 XXX Analysis[12325:816505] NSURL file:///Users/xxxxxx/Documents/xxxnalysis.pdf

at the end PDF file is saved but Program crash when the NSPanel closed.

codezero
  • 81
  • 1
  • 7

1 Answers1

12

CFURLRef and NSURL are toll-free bridged. So typically, you would just do this:

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

And when you no longer need the CFURL object:

CFRelease(cfurl);

Or if you're reasonably certain that the NSURL will stick around long enough, you can just do

CFURLRef cfurl = (__bridge CFURLRef)url;

If you're getting a crash, that probably means you're over-releasing something — specifically, that you're releasing an object that you don't own. I would suggest reading Apple's docs on object ownership:

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

dgatwood
  • 9,519
  • 1
  • 24
  • 48
  • 1
    How would I do this in Swift? Using CFBridgingRetain causes a runtime error and using (__bridge CFURLRef) causes a coding error. – Daniel Brower Sep 29 '18 at 07:09
  • Apparently, in Swift, those types are already bridged to native objects, so you should presumably just be able to cast it. See https://en.swifter.tips/toll-free/ – dgatwood Sep 29 '18 at 19:33
  • I've tried that. It doesn't work, but I found a simpler way around what I wanted to do. Thank you. – Daniel Brower Sep 29 '18 at 23:07