ARC and bridged cast
I found another explanation in the iOS documentation that I think is easier to understand:
__bridge
transfers a pointer between Objective-C and Core Foundation with no transfer of ownership.__bridge_retained (CFBridgingRetain)
casts an Objective-C pointer to a Core Foundation pointer and also transfers ownership to you.You are responsible for calling CFRelease or a related function to relinquish ownership of the object.
__bridge_transfer (CFBridgingRelease)
moves a non-Objective-C pointer to Objective-C and also transfers ownership to ARC.ARC is responsible for relinquishing ownership of the object.
Source: Toll-Free Bridged Types
I agree that the description is confusing. Since I just grasped them, I'll try to summarize:
(__bridge_transfer <NSType>) op
or alternativelyCFBridgingRelease(op)
is used to consume a retain-count of aCFTypeRef
while transferring it over to ARC. This could also be represented byid someObj = (__bridge <NSType>) op; CFRelease(op);
(__bridge_retained <CFType>) op
or alternativelyCFBridgingRetain(op)
is used to hand anNSObject
over to CF-land while giving it a +1 retain count. You should handle aCFTypeRef
you create this way the same as you would handle a result ofCFStringCreateCopy()
. This could also be represented byCFRetain((__bridge CFType)op); CFTypeRef someTypeRef = (__bridge CFType)op;
__bridge
just casts between pointer-land and Objective-C object-land. If you have no inclination to use the conversions above, use this one.
Maybe this is helpful. Myself, I prefer the CFBridging…
macros quite a bit over the plain casts.