Re: when __bridge isn't required
Re: when __bridge isn't required
- Subject: Re: when __bridge isn't required
- From: Robert Martin <email@hidden>
- Date: Sat, 27 Jul 2013 14:54:37 -0400
My take:
__bridge means 'do not transfer the retain count of <whatever on the RHS> to the LHS'. If the RHS involves some kind of create or new, then you'll get a leak since ARC won't release it.
__bridge_transfer means 'transfer the retain count of <whatever on the RHS> to the LHS'. If the RHS involves some kind of create or new, then you can just rely on ARC, or you'll have to release via CFRelease().
Since CFStringGetIntValue() does not return an object, you don't need __bridge at all - there's no 'retaining' going on behind the scenes. ARC sees you're getting back a scalar, and the compiler sees no ambiguity or error.
But CGImageSourceCreateWithURL() includes the keyword 'create' - so the object you get back has a retain count of 1. ARC will insist that you cast with __bridge or __bridge_transfer.
Under ARC, you have to let the compiler know whether you are taking responsibility (__bridge_transfer, ARC will release when it goes out of scope), or not (__bridge, followed by a CFRelease()) for ultimately releasing the newly created object.
I'm probably wrong, but this is how I've been working with ARC, based on the docs and blogs.
Rob
On Jul 27, 2013, at 2:31 PM, Matt Neuburg <email@hidden> wrote:
> I feel like I've asked this before, but I don't feel I'm grasping the answer. Why don't these work the same way under ARC:
>
> NSString* answer = @"42";
> int ans = CFStringGetIntValue((CFStringRef)answer);
>
> and
>
> NSURL* imageSource = [NSURL new];
> CGImageSourceRef src =
> CGImageSourceCreateWithURL((CFURLRef)imageSource, nil);
>
> The first one compiles (with no explicit __bridge). The second one doesn't; you must say __bridge explicitly. But why? They look completely parallel to me.
>
> The mystery is compounded by the fact that if you omit the cast entirely in the first example, the compiler claims that you need a bridged cast. But you don't; you just need a cast. That feels like a bug; if a mere cast is sufficient, the compiler should say so (and Fix-It should offer it as a possible fix).
>
> m.
>
> --
> matt neuburg, phd = email@hidden, http://www.apeth.net/matt/
> pantes anthropoi tou eidenai oregontai phusei
> Programming iOS 6! http://shop.oreilly.com/product/0636920029717.do
> RubyFrontier! http://www.apeth.com/RubyFrontierDocs/default.html
> TidBITS, Mac news and reviews since 1990, http://www.tidbits.com
>
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden