在使用classFromString实例化的类中调用方法?

时间:2012-05-14 22:41:33

标签: objective-c ios xcode

在另一个问题(how to instantiate an object of class from string in Objective-C?)中,建议:

id myclass = [[NSClassFromString(@"MyClass") alloc] init];
[myclass FunctioninClass];

但是,[myClass FunctioninClass]会产生错误,因为编译器不知道FunctioninClass是否存在。

我知道可以存在的类是父母的所有后代。并且该父级具有我想要调用的方法的原型,除了我想调用重写的后代方法。这是否表明了解决方案?

3 个答案:

答案 0 :(得分:4)

您可以改用performSelector。这是Apple doc

[myClass performSelector:@selector(FunctioninClass)];

答案 1 :(得分:2)

在@ user523234的评论之后,我决定改进我的答案并予以纠正。然而,他的回答在我看来不够好,如果选择器不可用,会导致代码崩溃。

所以这是解决方案:

id myclass = [[NSClassFromString(@"MyClass") alloc] init];

if ([myclass respondsToSelector:@selector(FunctioninClass)])
{
    [myClass performSelector:@selector(FunctioninClass)];
}

使用- respondsToSelector:将确保您检查班级中是否存在该扇区。但是,您每次都需要使用preformSelector。我不确定你是否可以动态地输入标识符。

答案 2 :(得分:1)

由于您知道所有可能的类派生自一个父类,并且该类包含您需要的方法,因此只需:

ParentClass *myclass = [[NSClassFromString(@"MyClass") alloc] init];
[myclass FunctioninClass];

您使用NSClassFromString选择要实例化的子类的事实并不是真正相关的。这只是一个简单的继承情况:myclass" is-a" ParentClass,因此您可以在其上调用ParentClass的任何方法。