2016-04-21 11 views
3

Apple gibt Beispielcode zum Erstellen eines PDF-Dokuments. Aber es verwendet CFURLRefSo konvertieren Sie NSURL in CFURLRef

NSPanel Savepanel gibt NSURL.

Ich kann nicht konvertieren NSURL zu CFURLRef

path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8); 

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

Ausgang ist

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

convert Code, die ich finden

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

Ausgang ist

2016-04-22 00: 37: 20,494 XXX Analysis [12325: 816505] NSURL Datei: ///Users/xxxxxx/Documents/xxxnalysis.pdf

in der PDF-Datei Ende wird gespeichert aber Programmabsturz beim Schließen des NSPanels.

+0

wie kommt der Absturz aussieht? Irgendwelche Fehler im Sandbox-Log? –

+0

Ich habe meine Antwort gefunden. wenn Sie CFStringRef nicht mit CFStringCreateWithCString erstellen. Sie müssen CFRelease (URL) nicht aufrufen; – codezero

Antwort

9

CFURLRef und NSURL sind gebührenfrei gebrückt. So Normalerweise würden Sie nur dies tun:

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

Und wenn Sie nicht mehr benötigen, die CFURL Objekt:

CFRelease(cfurl); 

Oder wenn Sie sich ziemlich sicher, dass die NSURL lange genug bleiben, werden Sie kann nur tun

CFURLRef cfurl = (__bridge CFURLRef)url; 

Wenn Sie einen Absturz, wenn es darum, die wahrscheinlich bedeutet, dass Sie etwas über-Releasing - speziell, dass Sie ein Objekt sind freisetzt, die Sie nicht besitzen. Ich würde vorschlagen, Apples docs auf Objektbesitz lesen:

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