在Objective-C中对动态类调用方法?

时间:2011-03-01 05:08:06

标签: objective-c

我如何制定

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

这样编译器不会发出警告说+ myMethod可能没有实现?

4 个答案:

答案 0 :(得分:8)

[NSClassFromString(classname) performSelector: @selector(myMethod:more:) withObject:param1 withObject:param2];

答案 1 :(得分:6)

快速& dirty:如果myMethod:more:是唯一的,则将NSClassFromString的返回值转换为id。方法绑定直到运行时才会发生,因此将调用正确的impl。

稍微清晰:如果param1和param2是-(id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject,则使用NSObject的id。当在类对象上调用时,它也适用于类方法。

答案 2 :(得分:3)

好吧,既然你有多个参数,就不能使用-performSelector:withObject:。您必须使用Objective-C在幕后使用的内容objc_msgSend()。但首先你必须施展它。方法如下:

在您的实施文件(.m)中,将行#import <objc/message.h>添加到顶部。然后,您需要适当地投射objc_msgSend()。在此示例中,我们假设param1param2是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);

答案 3 :(得分:-1)

首先尝试将NSClassFromString()返回的值进行类型转换为id