__bridge vs __bridge_transfer vs __bridge_retained
1 min readApr 19, 2018
__bridge
Two way OBJECTIVE-C ← → CF
Transfers a pointer between Objective-C and Core Foundation with no transfer of ownership
-(void)greetViaBridge
{
CFStringRef stringRef = CFStringCreateWithCString(NULL, "Hello World via bridge", kCFStringEncodingUTF8); NSString *text = (__bridge NSString *) stringRef;
NSLog(@"%@", text); CFRelease(stringRef);
}
__bridge_transfer
CF → OBJECTIVE-C
Moves a Core Foundation pointer to Objective-C with transfer of the ownership to ARC
-(void)greetViaBridgeTransfer
{
CFStringRef stringRef = CFStringCreateWithCString(NULL, "Hello World via bridge transfer", kCFStringEncodingUTF8); NSString *text = (__bridge_transfer NSString *) stringRef;
NSLog(@"%@", text);
}
__bridge_retained
OBJECTIVE-C → CF
Moves an Objective-C pointer to Core Foundation and transfers ownership and also responsibility of releasing the memory to you
-(void)greetViaBridgeRetained
{
NSString *text = @"Hello World via bridge retained";
CFStringRef stringRef = (__bridge_retained CFStringRef)text;
NSLog(@"NSString: %@", text);
NSLog(@"CFStringRef: %@", stringRef); CFRelease(stringRef);
}