добавление методов динамически - PullRequest
5 голосов
/ 25 июля 2011

Я пытаюсь использовать этот метод в Ссылка на время выполнения Obj-c

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

Я хочу добавить новый метод, например:

- [AClass drawWithFrame:(NSRect)rect inView:(id)view]

Пока я написал функцию C:

void drawWithFrameInView(id this, SEL this_cmd, NSRect frame, id view){
...
} 

теперь я готов сделать:

BOOL success = class_addMethod(NSClassFromString(@"AClass"), 
                               @selector(drawWithFrame:inView:), 
                               (IMP)drawWithFrameInView, 
                               "v@:@:@:");

но success никогда не ДА, я пробовал тот же подход с методами с более простыми сигнатурами, и это сработало. Поэтому я думаю, что проблема в последнем параметре: "v@:@:@:"

Что я должен передать в этом случае, чтобы мой новый метод заработал?

1 Ответ

8 голосов
/ 25 июля 2011

Это будет работать:

char *types = [[NSString stringWithFormat:@"v@:%s@", @encode(NSRect)] UTF8String];

BOOL success = class_addMethod(NSClassFromString(@"MyClass"), 
                               @selector(drawWithFrame:inView:), 
                               (IMP)drawWithFrameInView, 
                               types);

Причина, по которой ваш код не работает, заключается в том, что NSRect это , а не объект , это typedef до struct.

Подробнее о кодировках типов здесь .

...