2016-07-29 10 views
0

Ich habe den folgenden Code-Schnipsel:NSString * zu CFStringRef Ergebnisse in nutzlos char-Array

-(CFStringRef)setupFileName:(NSString*)_name :(NSString*)_extension 
{ 
NSString* tmpName = [_name stringByAppendingString:_extension]; 
CFStringRef ref = (__bridge CFStringRef)tmpName; 
return ref; 
} 

Als ich bei der return-Anweisung brechen, ref enthält die richtigen Daten, einen schönen String mit der Erweiterung. Aber wenn ich es wie folgt verwenden:

CFStringRef tickWav = [self setupFileName:_name :kTick]; 

Es ergibt sich eine nutzlose Zeichen Kette. Gibt es etwas, das meine Codierung beschädigt, wenn ich den richtigen Wert von der Funktion zurückgebe? Was kann ich tun?

+0

Nicht auf Ihr Problem bezogen, aber ... Ich würde empfehlen, Ihre Methode mit allen Parametern zu benennen: '- (CFStringRef) setupFileName: (NSString *) _ Name mit Erweiterung: (NSString *) _ extension' und auch zu vermeiden '_' für diese Art von Var. Warum wird 'stringByAppendingString:' aufgerufen, wenn 'tmpName' zwischen Klammern gesetzt wird? – Larme

+0

Es war in Klammern, weil die Besetzung zu CFStringRef ihre zuvor passiert .. Sie kennen eine Lösung für mein Problem? – bob

Antwort

1

Es gibt keine automatische CFTypeRef-Speicherverwaltung. Wenn Sie einen NSString zurückgeben, wird er automatisch freigegeben. Nicht so für einen CFStringRef. Also musst du die Arbeit selbst erledigen.

Sie müssen den CFStringRef mit CFRetain beibehalten und einen __bridge_retained Cast, nicht einen __bridge Cast ausführen. Sie überqueren die Brücke von der Objektwelt zur CFTypeRef-Welt; Sie müssen Speicherverwaltung für diese Zeichenfolge bereitstellen, wenn sie die Brücke überquert. Sie müssen dann den CFStringRef später im empfangenden Code manuell freigeben oder er wird undicht.

+0

Aber generell würde ich fragen, warum Sie die Brücke überhaupt überqueren. Würden Sie nicht eher einen NSString hier zurückgeben? – matt

+0

Weil ich einen CFStringRef brauche ... aber hey, __bridge_retained löste das Problem für mich, vielen Dank. Ich muss etwas mehr zu diesem Thema untersuchen. – bob

+0

Vielleicht möchte ich mein Buch lesen: http://www.apeth.com/iOSBook/ch12.html#_memory_management_of_cftyperefs – matt