Many thanks to all who responded.  Here's a few resolutions for the archives:

1.  CFType: cast to id and autorelease.  Verdict: it is OK (under manual memory 
management).

http://www.cocoabuilder.com/archive/cocoa/215004-autorelease-cgimageref.html
http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html

Sending an autorelease to an object or opaque type puts the pointer into a 
collection that will later receive a release call.  CFType can be released.  
(This has worked for me in practice for quite some time, but I'm looking to 
move to ARC for a new project).

2.  Returning an autoreleased opaque type under ARC.  Verdict: Might not even 
make sense.

Mike Ash's excellent explanations did help clarify things, but in the end, I'm 
not sure that my original request is even sensible.  I was looking to hand over 
an opaque type that was in some collection scheduled to get released later.  I 
don't think any of the casting annotations amount to this.  Mike's only example 
of bridging in this direction (toward a CFType) was the __bridge_retained to 
transfer ownership from the system into our hands, which is where I was in the 
first place returning the CGColor.

3.  What to do?  Keep it simple: I'll modify the method name to reflect the 
need to memory manage the return value - CGImageCopy.  Here is the final method:

- (CGColorRef)CGColorCopy
{
   NSColor *colorRGB = [self 
colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
   CGFloat components[4];
   [colorRGB getRed:&components[0] green:&components[1] blue:&components[2] 
alpha:&components[3]];
   CGColorSpaceRef theColorSpace = 
CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
   CGColorRef theColor = CGColorCreate(theColorSpace, components);
   CGColorSpaceRelease(theColorSpace);
   return theColor;
}

Thanks for everyone's input!

John



On Oct 19, 2011, at 10:09 AM, John Joyce wrote:

> Check the nice clear tutorial at 
> http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html
> It spells out how to handle CF types in ARC.
> 
> On Oct 19, 2011, at 9:52 AM, Wade Tregaskis wrote:
> 
>>> Following Cocoa convention you'd want to cast it to what and autorelease 
>>> it? CGColorRef isn't toll-free bridged with anything. If you have been 
>>> casting it to id and autoreleasing it you might have gotten away with that 
>>> before but I don't think it's documented anywhere you can do that with 
>>> CFTypes in general.
>> 
>> You can.  It may not be in the docs, but all CF types are also NSObjects (or 
>> a subclass thereof).
>> 
>>> You could change the semantics of the method to return a CFRetain()ed 
>>> object and make it the responsibility of the caller to release it (and 
>>> change the name of the method too to make it clear) or you can create a 
>>> UIColor with your CGColorRef, then CFRelease() it and return the UIColor. 
>>> 
>>> Mixing autorelease and CFTypes does't seem like a great idea, but I'm 
>>> prepared for someone to point out a whole piece of documentation I've never 
>>> seen, that often seems to happen!
>> 
>> No, mixing them is indeed a bad idea.  CF doesn't have auto release pools, 
>> so anything dealing with CF types is free to not think about them, and in 
>> practice often does.  I would go with explicitly returning the CGColorRef 
>> retained.
>> _______________________________________________
> 

_______________________________________________

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

Reply via email to