• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: to __bridge or not to __bridge?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: to __bridge or not to __bridge?


  • Subject: Re: to __bridge or not to __bridge?
  • From: Thomas Clement <email@hidden>
  • Date: Mon, 13 Feb 2012 16:26:10 +0100

Doc says: "The compiler understands Objective-C methods that return Core Foundation types follow the historical Cocoa naming conventions"
This applies to case 1, not case 2.

https://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

On Feb 13, 2012, at 3:20 PM, Jean-Denis MUYS wrote:

> I am a bit puzzled by the LLVM 3.0 behavior (Xcode 4E71d if that matters) regarding casting between id and a Core Foundation type.
>
> Here is a sample method that illustrates the issue:
>
> - (void) arcTest:(UIImage *)image
> {
> 	CALayer *myLayer = self.view.layer;
>
> 	myLayer.contents = (id) image.CGImage;	// case 1: the compiler is happy
>
> 	CGImageRef itsCGImage = image.CGImage;
> 	myLayer.contents = (id) itsCGImage;		// case 2: the compiler complains
> }
>
> This is iOS code, but that shouldn't matter. Here are the facts:
>
> - The CALayer class defines contents thus:
>
> 	@property (retain) id contents;
>
> And its documentation tells us we typically put a CGImageRef in there.
>
> - The UIImage class defines  CGImage thus
>
> 	@property (nonatomic,readonly) CGImageRef CGImage;
>
> So I understand the need to typecast the CGImageRef to id: the destination is declared as id, the value is CGImageRef.
>
> But what I don't understand, is why the compiler likes case 1 above, but not case 2. On case 2, it complains:
>
> 	"Cast of C pointer type 'CGImageRef' (aka 'struct CGImage *') to Objective-C pointer type 'id' requires a bridged cast"
>
> Then Xcode suggests two different fixes:
>
> 	myLayer.contents = (__bridge id) itsCGImage;
> 	myLayer.contents = (__bridge_transfer id) itsCGImage;
>
> I kind-of understand why the compiler needs this qualified cast. But then why doesn't it need it for case 1?
>
> Secondarily, just to check my understanding, the correct qualification is __bridge here, because the destination will balance all retains with releases. Correct? By doing so, the emitted code will leave image.CGImage. On the other hand, with a __bridge_transfer, the compiler will emit a call to release on itsCGImage after the myLayer.contents setter returns. Still correct?
>
> Thanks,
>
> Jean-Denis
>
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Xcode-users mailing list      (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


  • Follow-Ups:
    • Re: to __bridge or not to __bridge?
      • From: Jean-Denis MUYS <email@hidden>
References: 
 >to __bridge or not to __bridge? (From: Jean-Denis MUYS <email@hidden>)

  • Prev by Date: to __bridge or not to __bridge?
  • Next by Date: Re: to __bridge or not to __bridge?
  • Previous by thread: to __bridge or not to __bridge?
  • Next by thread: Re: to __bridge or not to __bridge?
  • Index(es):
    • Date
    • Thread