Objective-C Runtime: как удалить метод из класса? - PullRequest
4 голосов
/ 30 октября 2011

В Objective-C Runtime Reference я вижу class_addMethod, но не class_removeMethod.Как динамически удалить метод?

Кроме того, class_addMethod добавляет метод экземпляра или метод класса?

1 Ответ

5 голосов
/ 27 ноября 2011

Как упомянул Inerdial в своем комментарии, на главный вопрос (Как можно удалить метод из класса во время выполнения?) Довольно исчерпывающе дан ответ здесь .

MattDiPasquale также спрашивает:

Кроме того, class_addMethod добавляет метод экземпляра или метод класса?

Inerdial снова верен:

class_addMethod добавляет метод экземпляраи что для добавления метода класса вам нужно добавить метод экземпляра к классу класса.

Учитывая Class c, мы можем получить в свои руки классиз которых это экземпляр (известный как его «метакласс») просто как

Class metac = object_getClass(c);

Чтобы затем «добавить метод класса» в c, мы добавляем метод в metac, используя class_addMethod.

Если, например, в другом месте мы уже определили

id myClassMethodImplementation(id self, SEL _cmd) {
    //implementation
}

Затем мы можем добавить метод класса к c следующим образом:

BOOL success = class_addMethod(metac, @selector(myClassMethod), (IMP)myClassMethodImplementation, "@@:");

или эквивалентно

BOOL success = class_addMethod(object_getClass(c), @selector(myClassMethod), (IMP)myClassMethodImplementation, "@@:");

Чтобы просто добавить этот же метод в качестве метода instance на c, мы просто пишем

BOOL success = class_addMethod(c, @selector(myClassMethod), (IMP)myClassMethodImplementation, "@@:");

Ссылки: 1. Objective-C Runtime Reference 2. Руководство по программированию в Objective-C - Кодировки типов 3. Какао с любовью - Что такое мета-класс в Objective-C?

...