2012-08-14 81 views
5

山獅介紹new APIs,其中一些我們已經在我們的項目中實施了類別。山獅的條件類別

例如,我們有一個類別NSColor+CGColorAdditions,其實施CGColorcolorWithCGColor:NSColor。這些方法已被添加到Mountain Lion中。

理想情況下,如果客戶端操作系統比Mountain Lion年齡大,我們希望使用這些類別,如果是Mountain Lion,則不使用它們。我們應該怎麼做?還是有更好的選擇?

回答

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 2012-08-14 10:47:55

+0

@hgpc可能是應用程序的第一行:didFinishLaunchingWithOptions:方法。 – 2012-08-14 11:05:27

+1

真的嗎?我把它放在一個+加載方法。 – 2012-08-14 16:05:19

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

我不太確定你想爲此使用'constructor',因爲不清楚它何時會被調用與正在建立的運行時相關。 A ['+ load'](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050-加載)類別的方法可能是適當的地方做到這一點。 – 2012-08-14 14:31:39

+0

@ W'rkncacnter據我所知,構造函數在main之前調用。 – 2012-08-14 14:45:09

+1

@ H2CO3:對 - 我擔心的是它們在構建運行時之前被調用,但我不確定何時會發生這種情況。當libobjc被加載時它是有意義的,所以這可能不是一個問題,但是'+ load' _is_明確地用於在main之前調用類。 – 2012-08-14 18:26:15