2013-12-23 3 views
7

Я пытаюсь поддерживать новые добавленные методы NSColor в 10.9 на старых системах. Pre-10.9 У меня были эти категории, которые позволяли мне унифицировать код между Mac и iOS. Теперь, когда у 10.9 есть эти методы, я получаю странный рисунок везде, где я их использую. Я хочу добавить эти методы динамически к более старым временам выполнения, и я нашел несколько ссылок, как это сделать, используя class_addMethod. Проблема в том, что, хотя addMethod возвращает успех, методы не вызываются.Добавление метода Objective-C в класс во время выполнения

NSColor * 
fColorWithWhite(id self, SEL _cmd, float white, float alpha) { 
    return [NSColor colorWithDeviceWhite: white 
            alpha: alpha]; 
} 

NSColor * 
fColorWithRedGreenBlue(id self, SEL _cmd, float red, float green, float blue, float alpha) { 
    return [NSColor colorWithDeviceRed: red 
           green: green 
            blue: blue 
           alpha: alpha]; 
} 

+ (void)addLegacySupport { 
    Class class = NSClassFromString(@"NSColor"); 

    BOOL success = class_addMethod(class, @selector(colorWithWhite:alpha:), (IMP)fColorWithWhite, "@@:ff"); 
    NSLog(@"colorWithWhite:alpha: - %i", success); 

    success = class_addMethod(class, @selector(colorWithRed:green:blue:alpha:), (IMP)fColorWithRedGreenBlue, "@@:ffff"); 
    NSLog(@"colorWithRed:green:blue:alpha: - %i", success); 
} 

Любые указатели будут очень признательны.

ответ

4

Вы пытаетесь добавить методы класса. Вам нужно добавить их в метакласс.

Class meta_cls = objc_getMetaClass("NSColor"); 
+0

Это выглядело настолько удивительно, что я не мог поверить, что не видел его в документах API, но также возвращал false на class_addMethod. – greg

+0

Решенный: вышеописанное. Основная проблема заключалась в том, что литье двойного к CGFloat в float. – greg

6

class_addMethod() добавляет метод экземпляра в класс. Вы пытаетесь добавить метод класса. Таким образом, вам нужно добавить метод к метаклассу (classes are instances of their metaclasses), который вы можете получить, позвонив object_getClass() с классом в качестве аргумента:

Class metaclass = object_getClass(NSClassFromString(@"NSColor")); 

BOOL success = class_addMethod(metaclass, @selector(colorWithWhite:alpha:), (IMP)fColorWithWhite, "@@:ff"); 
+0

Успех. class_addMethod возвращает false. – greg

+0

Huh. Он работает здесь. С какими SDK вы тестируете? Он будет терпеть неудачу, если метод уже существует (т. Е. На 10.9). –

+0

Я строю против 10.8, так что я действительно вижу ошибки и не имею поддержки кода. На данный момент у меня нет системы до 10.9, поэтому мне показалось, что это лучше всего для тестирования этого теста до выпуска. – greg

Смежные вопросы