Conditional categories in Mountain Lion

后端 未结 2 425
Happy的楠姐
Happy的楠姐 2020-12-11 06:14

Mountain Lion introduced new APIs, some of which we had implemented as categories in our project.

For examples, we have a category NSColor+CGColorAdditions

相关标签:
2条回答
  • 2020-12-11 06:49
    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_, "@@:@");
    }
    
    0 讨论(0)
  • 2020-12-11 06:58

    I thought it might also be helpful to post what I did based on H2CO3's answer.

    NSColor+CGColorAdditions.m became:

    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_, "@@:");
        }
    }
    
    0 讨论(0)
提交回复
热议问题