Вызывать метод динамического класса в Objective-C? - PullRequest
2 голосов
/ 01 марта 2011

Как мне сформулировать

[NSClassFromString(classname) myMethod:param1 more:param2];

такое, что компилятор не выдает предупреждение о том, что + myMethod не может быть реализован?

Ответы [ 4 ]

8 голосов
/ 01 марта 2011
[NSClassFromString(classname) performSelector: @selector(myMethod:more:) withObject:param1 withObject:param2];
6 голосов
/ 01 марта 2011

Быстрый и грязный: приведите возврат NSClassFromString к id, если myMethod: more: уникален.Привязка метода не происходит до времени выполнения, поэтому будет вызываться правильный impl.

Немного чище: используйте NSObject's -(id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject, если param1 и param2 id sОн работает и для методов класса при вызове объекта класса.

3 голосов
/ 01 марта 2011

Ну, поскольку у вас есть несколько аргументов, вы не можете использовать -performSelector:withObject:.Вам придется использовать то, что Objective-C использует под капотом, objc_msgSend().Но сначала вам придется разыграть его.Вот как:

В вашем файле реализации (.m) добавьте строку #import <objc/message.h> в начало.Затем вам нужно разыграть objc_msgSend() соответственно.В этом примере мы предположим, что param1 и param2 являются объектами Objective-C и что -myMethod:more: возвращает void.

void (*myMsgSend)(id self, SEL _cmd, id param1, id param2);
myMsgSend = (void(*)(id, SEL, id, id))objc_msgSend;

После того, как вы произвели его соответствующим образом, вызовитеновая функция:

myMsgSend(obj, @selector(myMethod:more:), param1, param2);
0 голосов
/ 01 марта 2011

Попробуйте сначала ввести значение, возвращаемое от NSClassFromString() до id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...