On Sun, 30 Oct 2011 15:55:39 +0000, Igor Mozolevsky <i...@hybrid-lab.co.uk> said: >On 30 October 2011 15:15, Matt Neuburg <m...@tidbits.com> wrote: >> In ARC, this is legal: >> >> self.view.layer.contents = (id)[[UIImage imageNamed:@"boat.gif"] CGImage]; >> >> And this is legal: >> >> id ref = (id)[[UIImage imageNamed:@"boat.gif"] CGImage]; >> self.view.layer.contents = ref; >> >> But this is not: >> >> CGImageRef ref = [[UIImage imageNamed:@"boat.gif"] CGImage]; >> self.view.layer.contents = (id)ref; // compilation fails >> >> In the last case, I have to change id to __bridge id. My question is: What's >> the difference in the cases? In all situations I'm casting a CGImageRef to >> an id, so why does ARC permit this in the first cases but not in the last? >> Is it because UIImage's CGImage method is a method, and this fact somehow >> gives ARC further info? Thx - m. > >The compiler knows how to handle CF objects returned from Cocoa >methods, but doesn't know how to handle stuff created by yourself. I >thought that was fairly obvious from and explicit in the Transitioning >Notes? >
It's no use referring me to the Transitioning Notes. The problem is in part that they are wrong. This makes it hard to know what to do. Presumably we're talking about this? http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html Well, the example code there says: CAGradientLayer *gradientLayer = (CAGradientLayer *)[self layer]; gradientLayer.colors = [NSArray arrayWithObjects:[[UIColor darkGrayColor] CGColor], [[UIColor lightGrayColor] CGColor], nil]; The trouble is that in actual fact **that code does not compile** under ARC. ("Implicit conversion of a non-Objective-C pointer type 'CGColorRef' (aka 'struct CGColor *') to 'id' is disallowed with ARC.") So your humble narrator is no wiser than before about how to silence the compiler while properly crossing the bridge. My solution, discovered purely experimentation, is make the conversion explicit; this *does* compile: CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor], (id)[[UIColor lightGrayColor] CGColor], nil]; And now we're back to my original question. Is that the right way? And why am I able to get away without saying __bridge id (or whatever), as I would have to do if I were generating my own CGColor and not returning the CGColor via a built-in method? m. -- matt neuburg, phd = m...@tidbits.com, <http://www.apeth.net/matt/> A fool + a tool + an autorelease pool = cool! Programming iOS 4! http://www.apeth.net/matt/default.html#iosbook_______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com