5

Mountain Lion は新しい APIを導入しました。その一部は、プロジェクトのカテゴリとして実装しました。

たとえば、とforNSColor+CGColorAdditionsを実装したカテゴリがあります。これらのメソッドは Mountain Lion に追加されました。CGColorcolorWithCGColor:NSColor

クライアント OS が Mountain Lion より古い場合はこれらのカテゴリを使用し、Mountain Lion の場合は使用しないのが理想的です。どうすればこれを行うことができますか?または、より良い代替手段はありますか?

4

2 に答える 2

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_, "@@:@");
}
于 2012-08-14T10:26:36.310 に答える
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_, "@@:");
    }
}
于 2012-08-14T13:33:18.743 に答える