Переопределяем метод класса в рантайме

В кои-то веки потребовалось в рантайме переопределять методы класса. В документации сразу нашлась подходящая функция:

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

единственный аргумент, который может смутить - это types, который задает типы аргументов и возвращаемого значения в закодированном текстовом виде. Нужные значения можно посмотреть либо в документации, либо исппользовать @encode.

Вторая тонкость оказалась в том, что эта функция добавляет (или переопределяет) метод экземпляра, а что же делать если нужно заменить метод самого класса?

Правильно, получить метакласс с помощью object_getClass(ourClass) и заменить его метод как обычно :)

Comments