Typischerweise
NSString *yourFriendlyNSString = (__bridge NSString *)yourFriendlyCFString;
und
CFStringRef yourFriendlyCFString = (__bridge CFStringRef)yourFriendlyNSString;
Wenn Sie wissen möchten, warum das __bridge
Schlüsselwort vorhanden ist, lesen Sie die Apple-Dokumentation . Dort finden Sie:
__bridge
überträgt einen Zeiger zwischen Objective-C und Core Foundation ohne Eigentumsübertragung.
__bridge_retained
oder CFBridgingRetain
wirft einen Objective-C-Zeiger auf einen Core Foundation-Zeiger und überträgt Ihnen auch das Eigentum. Sie sind dafür verantwortlich, CFRelease oder eine verwandte Funktion aufzurufen, um das Eigentum an dem Objekt aufzugeben.
__bridge_transfer
oder CFBridgingRelease
verschiebt einen Nicht-Objective-C-Zeiger auf Objective-C und überträgt auch das Eigentum an ARC. ARC ist dafür verantwortlich, das Eigentum an dem Objekt aufzugeben.
Dies bedeutet, dass Sie in den oben genannten Fällen das Objekt umwandeln, ohne den Eigentümer zu ändern. Dies bedeutet, dass Sie in keinem Fall für den Speicher der Zeichenfolgen verantwortlich sind.
Es kann auch vorkommen, dass Sie das Eigentum aus irgendeinem Grund übertragen möchten.
Betrachten Sie zum Beispiel das folgende Snippet
- (void)sayHi {
CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);
NSString * aNSString = (__bridge NSString *)str;
NSLog(@"%@", aNSString);
CFRelease(str); //you have to release the string because you created it with a 'Create' CF function
}
In einem solchen Fall möchten Sie möglicherweise eine speichern, CFRelease
indem Sie das Eigentum beim Casting übertragen.
- (void)sayHi {
CFStringRef str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman);
NSString * aNSString = (__bridge_transfer NSString *)str;
// or alternatively
NSString * aNSString = (NSString *)CFBridgingRelease(str);
NSLog(@"%@", aNSString);
}
Das Eigentum an str
wurde übertragen, daher wird ARC jetzt den Speicher für Sie freigeben.
Auf der anderen Art und Weise um Sie werfen können , NSString *
um ein CFString
mit einem __bridge_retained
gegossenen, so dass Sie das Objekt besitzen werden , und Sie werden ausdrücklich darauf haben zu lösen , indem Sie CFRelease
.
Zum Abschluss können Sie haben
NSString → CFString
// Don't transfer ownership. You won't have to call `CFRelease`
CFStringRef str = (__bridge CFStringRef)string;
// Transfer ownership (i.e. get ARC out of the way). The object is now yours and you must call `CFRelease` when you're done with it
CFStringRef str = (__bridge_retained CFStringRef)string // you will have to call `CFRelease`
CFString → NSString
// Don't transfer ownership. ARC stays out of the way, and you must call `CFRelease` on `str` if appropriate (depending on how the `CFString` was created)
NSString *string = (__bridge NSString *)str;
// Transfer ownership to ARC. ARC kicks in and it's now in charge of releasing the string object. You won't have to explicitly call `CFRelease` on `str`
NSString *string = (__bridge_transfer NSString *)str;
CFStringRef foo (__bridge CFStringRef)theNSString;
undNSString *bar = (__bridge NSString *)theCFString;