2012-08-14 33 views
5

माउंटेन शेर ने new APIs पेश किया, जिनमें से कुछ हमने अपनी परियोजना में श्रेणियों के रूप में लागू किया था।माउंटेन शेर में सशर्त श्रेणियां

उदाहरण के लिए, हमारे पास NSColor+CGColorAdditions श्रेणी है जो CGColor और colorWithCGColor:NSColor के लिए लागू की गई है। इन तरीकों को माउंटेन शेर में जोड़ा गया है।

आदर्श रूप से, हम क्लाइंट ओएस माउंटेन शेर से पुराने होने पर इन श्रेणियों का उपयोग करना चाहते हैं, और यदि माउंटेन शेर है तो उनका उपयोग न करें। हम ऐसा कैसे कर सकते हैं? या क्या कोई बेहतर विकल्प है?

उत्तर

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

धन्यवाद। आप इस प्रारंभिक कोड को रखने की सिफारिश कहां करेंगे? क्या इसे श्रेणी फ़ाइल में स्थिर रूप से निष्पादित किया जा सकता है? – hpique

+0

@hgpc शायद एप्लिकेशन की पहली पंक्तियों में से एक है: didFinishLaunchingWithOptions: विधि। –

+1

वास्तव में? मैं इसे एक + लोड विधि में डाल दूंगा। –

2

मैंने सोचा कि यह एच 2CO3 के उत्तर के आधार पर मैंने जो किया है उसे पोस्ट करने में सहायक भी हो सकता है।

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

मुझे यकीन नहीं है कि आप इसके लिए 'कन्स्ट्रक्टर' का उपयोग करना चाहते हैं, क्योंकि यह तब स्पष्ट नहीं है जब इसे रनटाइम सेट अप के संबंध में बुलाया जाएगा। एक ['+ लोड'] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050- लोड) श्रेणी विधि शायद ऐसा करने के लिए उपयुक्त जगह है। –

+0

@ W'rkncacnter जहां तक ​​मुझे पता है, कन्स्ट्रक्टर कार्यों को मुख्य से पहले बुलाया जाता है। –

+1

@ एच 2CO3: दाएं - मेरी चिंता यह है कि रनटाइम का निर्माण करने से पहले उन्हें बुलाया जाता है, लेकिन जब ऐसा होता है तो मुझे बिल्कुल यकीन नहीं है। यह समझ में आता है कि यह तब होगा जब libobjc लोड हो जाता है, इसलिए शायद यह कोई समस्या नहीं है, लेकिन मुख्य रूप से कक्षाओं के साथ झुकाव के लिए 'लोड' _is_ स्पष्ट रूप से। –