Mountain Lion 引入了新的 API,其中一些我们已在项目中作为类别实现。
例如,我们有一个NSColor+CGColorAdditions
实现的类别CGColor
和colorWithCGColor:
for NSColor
。这些方法已添加到 Mountain Lion 中。
理想情况下,如果客户端操作系统早于 Mountain Lion,我们希望使用这些类别,如果是 Mountain Lion,则不要使用它们。我们应该怎么做?还是有更好的选择?
Mountain Lion 引入了新的 API,其中一些我们已在项目中作为类别实现。
例如,我们有一个NSColor+CGColorAdditions
实现的类别CGColor
和colorWithCGColor:
for NSColor
。这些方法已添加到 Mountain Lion 中。
理想情况下,如果客户端操作系统早于 Mountain Lion,我们希望使用这些类别,如果是 Mountain Lion,则不要使用它们。我们应该怎么做?还是有更好的选择?
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_, "@@:@");
}
我认为根据 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_, "@@:");
}
}