Mountain Lion中的条件类别

时间:2012-08-14 10:16:39

标签: objective-c macos categories osx-mountain-lion nscolor

Mountain Lion介绍了new APIs,其中一些是我们在项目中作为类别实现的。

例如,我们有一个NSColor+CGColorAdditions类别CGColorcolorWithCGColor: NSColor。这些方法已在Mountain Lion中添加。

理想情况下,如果客户端操作系统比Mountain Lion旧,我们希望使用这些类别,如果它是Mountain Lion,则不使用它们。我们应该怎么做?或者有更好的选择吗?

2 个答案:

答案 0 :(得分:7)

NSColor *_NSColor_colorWithCGColor_(Class self, SEL cmd, CGColorRef cgColor)
{
    // make an NSColor outta `cgColor` and return it
    return nsColor;
}

// inside some initialization code

if ([[NSColor class] respondsToSelector:@selector(colorWithCGColor:)]) {
    // on ML, don't do anything
} else {
    // older system, add your own category
    class_addMethod(objc_getMetaClass("NSColor"), @selector(colorWithCGColor:), (IMP)_NSColor_colorWithCGColor_, "@@:@");
}

答案 1 :(得分:2)

我认为根据H2CO3的回答发布我所做的事情可能也会有所帮助。

NSColor+CGColorAdditions.m成了:

static CGColorRef _NSColor_CGColor_(Class self, SEL cmd) {
    return nil; // TODO: Do something
}

static NSColor* _NSColor_colorWithCGColor_(Class self, SEL cmd, CGColorRef aColor) {
    return nil; // TODO: Do something    
}

__attribute__((constructor))
static void initialize_NSColor_CGColorAdditions() {
    if (![[NSColor class] respondsToSelector:@selector(colorWithCGColor:)]) {
        class_addMethod(objc_getMetaClass("NSColor"), @selector(colorWithCGColor:), (IMP)_NSColor_colorWithCGColor_, "@@:@");
    }
    if (![[NSColor class] instancesRespondToSelector:@selector(CGColor)]) {
        class_addMethod(objc_getClass("NSColor"), @selector(CGColor), (IMP)_NSColor_CGColor_, "@@:");
    }
}