0

別の質問(Objective-Cの文字列からクラスのオブジェクトをインスタンス化する方法は?)では、これが提案されました:

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

ただし、[myClass FunctioninClass]コンパイラは存在するかどうかわからないため、エラーが発生しますFunctioninClass

私は、存在する可能性のあるクラスがすべて1つの親の子孫であることを知っています。そして、その親には、オーバーライドされた子孫メソッドを呼び出したい場合を除いて、呼び出したいメソッドのプロトタイプがあります。それは解決策を示唆していますか?

4

3 に答える 3

4

代わりにperformSelectorを使用できます。これがAppleのドキュメントです

[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)];
}

--respondsToSelector:を使用すると、セクターがクラスに存在するかどうかを確認できます。ただし、毎回preformSelectorを使用する必要があります。識別子を動的に型キャストできるかどうかはわかりません。

于 2012-05-14T22:44:36.093 に答える
1

可能なすべてのクラスが1つの親クラスから派生し、そのクラスに必要なメソッドが含まれていることがわかっているので、次のようにします。

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

NSClassFromStringインスタンス化するサブクラスを選択するために使用しているという事実は、実際には関係ありません。これは単純な継承状況です。myclass「is-a」ParentClassなので、任意のメソッドを呼び出すことができますParentClass

于 2012-05-15T02:01:03.853 に答える