0

在另一个问题(如何在 Objective-C 中从字符串实例化类对象?)中,有人建议这样做:

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

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

我确实知道可能存在的班级都是一位父母的所有后代。并且该父级具有我要调用的方法的原型,除了我要调用覆盖的后代方法。这是否建议解决方案?

4

3 回答 3

4

您可以改用 performSelector。这是苹果文档

[myClass performSelector:@selector(FunctioninClass)];
于 2012-05-14T23:03:42.590 回答
2

在@user523234 发表评论后,我决定改进我的答案并更正它。然而,在我看来,他的回答不够好​​,如果选择器不可用,它会使您的代码崩溃。

所以这里是解决方案:

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

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

使用-responsToSelector:将确保您检查该部门是否存在于类中。但是,您每次都需要使用 preformSelector。我不确定您是否可以动态类型转换标识符。

于 2012-05-14T22:44:36.093 回答
1

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

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

NSClassFromString用来选择要实例化哪个子类的事实甚至并不真正相关。这只是一个简单的继承情况:myclass“is-a” ParentClass,所以你可以调用ParentClass它的任何方法。

于 2012-05-15T02:01:03.853 回答