Как динамически добавить метод класса?

Используя среду выполнения Objective-C, как мне добавить метод +layerClass в закрытый класс UIGroupTableViewCellBackground (а не в его суперкласс, UIView)? Примечание. Это только для тестирования (чтобы увидеть, как UITableViewStyleGrouped устанавливает ячейки backgroundView и selectedBackgroundView).


person ma11hew28    schedule 21.02.2012    source источник
comment
ты к себе берешь? вопрос/ответ? опубликовал ответ сам через 5 минут?   -  person Saurabh Passolia    schedule 21.02.2012
comment
@samfisher: Это совершенно законно: meta.stackexchange.com/q/2706 Мэтт просто добавляет в хранилище информации.   -  person jscs    schedule 21.02.2012
comment
спасибо @JoshCaswell за то, что просветил меня по этому поводу .. !!   -  person Saurabh Passolia    schedule 21.02.2012


Ответы (2)


Чтобы динамически добавить метод класса вместо метода экземпляра, используйте object_getClass(cls) для получения метакласса, а затем добавьте метод в метакласс. Например.:

UIKIT_STATIC_INLINE Class my_layerClass(id self, SEL _cmd) {
    return [MyLayer class];
}

+ (void)initialize {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = object_getClass(NSClassFromString(@"UIGroupTableViewCellBackground"));
        NSAssert(class_addMethod(class, @selector(layerClass), (IMP)my_layerClass, "@:@"), nil);
    });
}

Вы также можете сделать это проще, добавив метод +layerClass в категорию UIGroupTableViewCellBackground и используя прямое определение класса, то есть @class UIGroupTableViewCellBackground, чтобы заставить его скомпилироваться.

person ma11hew28    schedule 21.02.2012
comment
Также #include ‹objc/runtime.h› - person Kevin; 12.02.2016

Попробуйте это волшебство:

#include <objc/runtime.h>

+ (void)load {
    class_addMethod(objc_getMetaClass("UIGroupTableViewCellBackground"), 
        @selector(layerClass), (IMP)my_layerClass, "@:@");
}
person malhal    schedule 01.05.2014