On Jan 20, 2014, at 2:27 PM, Michael Crawford wrote:

> I'm working on a Mac OS X product that currently runs on 10.6 through to 
> 10.9.  This product includes an NSColor category method named CGColor, which 
> is patterned after the iOS UIColor interface and returns a CGColorRef.
> 
> @interface NSColor (CGColor)
> - (CGColorRef)CGColor CF_RETURNS_RETAINED;
> @end
> 
> As I'm sure you are aware, 10.8 now defines a method that does the same thing 
> using the same name.  I'd like to make it so that calling code doesn't have 
> to distinguish between these two methods but invokes the correct one based on 
> which version of the runtime is present.  What is the best approach to 
> solving this problem?

1) Put the method into a category in a loadable bundle.  Only load that bundle 
if ![NSColor instancesRespondToSelector:@selector(CGColor)].

2) Put the implementation in a function with the right signature for the IMP of 
that method.  At runtime, if NSColor doesn't implement the method (as above), 
use the Objective-C runtime to add the method to the class with your function 
as the implementation.

static CGColorRef my_NSColor_CGColor_imp(id self, SEL _cmd)
{
    // ...
}

Early in app start-up:

    if (![NSColor instancesRespondToSelector:@selector(CGColor)])
        class_addMethod([NSColor class], sel_registerName("CGColor"), 
(IMP)my_NSColor_CGColor_imp, "@@:");


> On Jan 23, 2014, at 4:02 AM, Greg Parker <gpar...@apple.com> wrote:
> 
>> On Jan 20, 2014, at 12:27 PM, Michael Crawford <michaelacrawf...@me.com> 
>> wrote:
>>> I also realize that the 10.8 version returns an autoreleased object whereas 
>>> the version written a couple of years ago must have the resulting reference 
>>> freed by the caller.  I'm not sure how Apple pulls that off with a CF 
>>> reference but I'd love to have a solution for that as well.
>> 
>> The NS/CF bridge means that calling autorelease on a CF object works fine.
> 
> Thanks for the reply, Greg.  I running with ARC enabled.  The compiler flags 
> any calls to autorelease.  What am I missing?

You can compile individual translation units with ARC disabled.

Regards,
Ken


_______________________________________________

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to