How to Convert NSURL to CFURLRef

codezero picture codezero · Apr 21, 2016 · Viewed 7.2k times · Source

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.

Answer

dgatwood picture dgatwood · May 19, 2016

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