有条件的关键词山狮(Conditional categories in Mountain Lion)

2019-06-27 00:35发布

山狮推出了新的API ,其中有些我们已经在我们的项目类别执行。

对于例子,我们有一个类别NSColor+CGColorAdditions是实现CGColorcolorWithCGColor:NSColor 。 这些方法已经在山狮被添加。

理想情况下,我们想如果客户端操作系统是比山狮以上才能使用这些类别,而不是使用它们,如果它的山狮。 我们应该怎么做? 还是有更好的选择?

Answer 1:

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_, "@@:@");
}


Answer 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_, "@@:");
    }
}


文章来源: Conditional categories in Mountain Lion