__bridge vs __bridge_transfer vs __bridge_retained

Zafer Şevik
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);
}

--

--